2013-02-23 111 views
3

我有以下代碼:switch語句和增量

int i = 1; 
int j = 0; 
switch (i++) 
{ 
case 1: j += i; 
case 2: j += i; 
case 3: j += i; 
break; 
} 
printf("%d %d",i, j); 

i++表達式計算i到1,因爲它是一個遞增運算符,因此在殼體1的語句將被執行,這意味着j被評估到2.然後,如果沒有中斷,程序將繼續執行以下所有語句。由於i的值不會更改,因此j的值也不會。所以我期望輸出是類似2 2,但它原來是2 6。任何人都可以給我一個解釋,謝謝!

回答

5

由於i的值沒有變化,所以j的值也不變。

不正確。

j += i相同j = j + ii is 2一旦switch(..)聲明。

這執行3次給你6

+0

請原諒我的無知,我只是認爲j + = i相當於j = i + 1。所以i(1)的原始值將被用於觸發情況1,然後在處理情況1的語句之前將其設置爲遞增的值(2),對嗎? – drawar 2013-02-23 09:45:00

+0

@drawar這是正確的。 – 2013-02-23 09:46:19

+0

這絕對有幫助,非常感謝! – drawar 2013-02-23 10:36:24

2

問題是在處理case語句之前評估「switch(i ++)」。因此,i ++會將i設置爲2.但是,由於i ++是後增量,因此它將評估爲1。因此,第一種情況將被觸發。由於沒有中斷語句,所以代碼將落入所有三個導致j == 6的結果。

1

j將在開關塊中增加三倍。我將首先進入第一種情況,因爲我後增加。由於沒有休息狀態,它將通過所有的情況說明,從而給出值6

1

必須在每種情況下添加一個break語句以防止跌倒通過行爲。 你覺得代碼工作的方式是這樣:
1.開關評估I = 1
2.增量I爲2
3.輸入開關和執行情況1.
4.退出開關。
的方式,它實際上發生的情況:
1.切換評估I = 1
2.遞增i到2.
3.輸入switch語句和EXCUTE殼體1
4.秋季通過和執行情況2。
5.執行並執行案例3.
6.退出switch語句。

對於要嘗試的行爲:
開關(I ++)
{
殼體1:J + = I;
break;
...執行相同的情況下,2和3的情況下
}

0

如果你做了J =我,而不是J + =我,你所期望的答案會來。但是你正在使用j + = i,它轉換爲j = j + i;這意味着j每一步都會更新。