3

次のコードがあります。

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 22 6. 誰か説明してくれませんか、ありがとう!

4

5 に答える 5

5

i の値は変わらないので、j の値も変わりません。

違います。

j += iは , と同じでj = j + i、ステートメントi is 21 回あります。switch(..)

これを3 回実行すると、 が得られます6

于 2013-02-23T09:35:07.250 に答える
2

要点は、case ステートメントが処理される前に「switch(i++)」が評価されることです。したがって、i++ は i を 2 に設定します。ただし、i++ はポスト インクリメントであるため、1 に評価されます。したがって、最初のケースがトリガーされます。break ステートメントがないため、コードは 3 つすべてを通過し、j==6 になります。

于 2013-02-23T09:38:29.483 に答える
1

フォールスルー動作を防ぐために、各caseステートメントにbreakステートメントを追加する必要があります。コードが機能していると思う方法は次のようになります
。1。スイッチはi=1を評価します
。2。iを2にインクリメントします。3
。スイッチに入り、ケース1を実行します
。4。スイッチを終了します。
実際に発生する方法:
1。Switchはi = 1を評価します。2。i
を2にインクリメントし
ます。3。switchステートメントを入力し、ケース1を実行します
。4。フォールスルーしてケース2を実行し
ます。5。フォールスルーしてケース3.6を実行し
ます。 。switchステートメントを終了します。

必要な動作については、次のようにしてください
。switch(i ++)
{
ケース1:j + = i;
壊す;
...ケース2とケース3についても同じようにします
}

于 2013-02-23T09:52:30.273 に答える
1

j は switch ブロックで 3 回インクリメントされます。i はポスト インクリメントされるため、最初にケース 1 に移動します。ブレーク ステートメントがないため、すべてのケース ステートメントを通過し、値 6 を与えます。

于 2013-02-23T09:46:45.670 に答える
0

j+= i の代わりに j = i を実行していれば、期待した答えが返ってきたはずです。ただし、j + = i を使用しているため、j = j + i; に変換されます。つまり、j はすべてのステップで更新されます。

于 2013-02-23T10:19:22.880 に答える