2017-04-26 28 views
1
int i,j=0; 
    for(i=0;i<N;i++){ 
     switch(i){ 
      case 0: 
      case 1: if(i<1) break; i=123; 
      case 456: j=666; break; 
      default: j=777; 
     } 
     if(j==666) break; 
    } 
    printf("%i %i\n",i,j); 

我想問一下在這種情況下switch語句的正確縮進情況。據我瞭解,Switch Statement - 斷線後正確縮進的線

case 0: 
    case 1: if(i<1) break; i=123; 

相當於

case 0: case 1:{ 
     if(i<1){ 
      break; 
     } 
     i=123; 
    } 

不過,我不case 1突破後瞭解i=123。我也曾嘗試用不同的N值玩耍,發現只要N>=2我總是會得到的

的輸出,但我沒有看到的i價值如何到達456以便case 456被觸發。

+0

C中的縮進並不重要(對於編譯器),因此要求「正確」縮進本質上是詢問個人偏好 – UnholySheep

+0

您可能想看看['-Wimplicit-fallthrough'](https:// gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/Warning-Options.html#Warning-Options)選項添加到GCC 7.1 - 您將不得不搜索它。或者再次,也許這超出了你現在準備處理的範圍,但它在未來的某個時間可能會有用。請注意,在C語言中,控制流程在'case'標籤之間繼續,除非有'break'(或者如果有周圍循環,或者返回,或者goto或者其他任何控制轉移, longjmp()','exit()'或其他任何'不返回'函數)。 –

回答

0

我們將格式化的代碼更易讀,並提出意見解釋:

int i, j = 0; 

for(i = 0; i < N; i++){ 
    switch (i) { 
     case 0: 
     case 1:   // Take this case if i is 0 or 1 
      if (i < 1) 
       break; // if i < 1 (in other words, it's 0), then break out of switch 
      i = 123;  // if i wasn't < 1, then set i to 123 AND fall through to next case 
     case 456:   // take this case if i is (originally) 456 
         // (prior statement still falls through here!) 
      j = 666;  // this will happen if either i was 456, or if i was 1 
         // and then set to 123 
      break; 
     default: 
      j = 777; 
    } 

    if (j == 666) 
     break; // break out of for loop if i is 666 
} 

printf("%i %i\n", i, j); 

if子句中增加一個功能塊圍繞單個語句不改變它的行爲。所以在這種情況下,這樣的:

if (i < 1) 
    break; 

具有相同的行爲,因爲這:

if (i < 1) { 
    break; 
} 

break並不適用於if塊。它仍然適用於外部switch

簡單地說,只是switch創建的i值跳轉表。在交換機的情況下,A break將退出交換機的「底部」。如果到達case的末尾並且沒有中斷,那麼代碼將繼續執行下一個casedefault(如果有的話)。

0

我相信你對「縮進」與病例陳述「預期分離」之間的混淆。

case語句實際上只是標籤。除非通過break聲明分開,否則它們充當落地模式。

所以,在你的情況下,i不需要是456來「觸發」case 456:和相關的陳述。 1的值將具有相同的效果。

不過,我不case 1突破後瞭解i=123

那麼,這是一個條件break聲明。在i的值爲01的情況下都會遇到if條件。在i的值爲0的情況下,條件檢查將成功,並且將跳出switch語句。否則,它將繼續並執行賦值語句。

所以,只要N(其他循環條件)是>=1i將被設置爲123j666

...但我沒有看到的i價值如何到達456爲了case 456被觸發。

它不需要,這是一個穿透行爲。


關於「縮進」的一部分,那麼,編譯器不關心壓痕,我們人類的實際重要性。適當的縮進使得代碼易讀易維護,從而使其具有價值。

0

咱們格式的代碼更恰當:

int i,j=0; 
for(i=0;i<N;i++){ 
    switch(i){ 
    case 0: 
    case 1: 
     if(i<1) 
     break; 
     i=123; 
    case 456: 
     j=666; 
     break; 
    default: 
     j=777; 
    } 
    if(j==666) break; 
} 
printf("%i %i\n",i,j); 

i爲1 if (i<1)條件值爲false。因此break不會運行,並且執行if(即i=123)之後的語句。然後到達case 456,其中j設置爲666,並跳出switch。此時,它達到if (j==666),該值爲true,並突破for

0

我簡化了你的代碼來解釋switch是如何工作的。

#include <stdio.h> 

int main(){ 
    int i; 
    int N=5; 

    for(i=0;i<N;i++){ 
     printf("i: %d\n",i); 
     switch(i){ 
     case 0: 
     case 1: 
      if(i<1){ 
      printf("in case 1 in if when case: 0 \n"); 
      break; 
      } 
      else{ 
      printf("in case 1 after if --> in else\n"); 
      } 
     case 3: 
      printf("in case 3\n"); 
      break; 
     default: 
      printf("default : "); 
      printf("i: %d\n",i); 
     } 

     if(i==4){ 
      printf("after switch\n"); 
      break; 
     } 
    } 

    printf("after for\n"); 

    return 0; 
} 

程序輸出:https://i.stack.imgur.com/pDJVo.png

只需在switch塊時執行case 0,程序控制進入 case 1因爲你不輸入任何表情。