3

私は次のコードを書きました:

int i = 0;  
switch(i++)  
{
   case 0:  
     cout << 0;  
   case 1:  
     cout << 1;
}  
cout << "\n" << i;  

コードの出力は次のようになりました。

01  
1

誰かが出力の最初の行を説明できますか?0と1の両方が印刷されるのはなぜですか?

4

4 に答える 4

18

まず、式i++( post-increment operator ) は 0 に評価されます (ただし、値はi1 に設定されます)。の中switchで、case 0:ブランチが選択されています。

次に、 のbreak後にがないため、プログラムはラベルcase 0:内のコードの実行を続行します。case 1:

要約すると、最初の分岐から 0、2switch番目の分岐から 1、そして の最終値であるため、別の 1 になりますi

于 2011-03-08T09:46:34.963 に答える
7

breakケースごとにafterを追加する必要があるため、次のステートメントの実行が妨げられます。例えば

switch(i++)  
{
   case 0:  
     cout<<0;  
     break;
   case 1:  
     cout<<1;
     break;
}  

確かに、2番目の休憩は不要ですが、一貫性を保つためにそこに配置しました

于 2011-03-08T09:46:43.540 に答える
2

あなたは「休憩」を置く必要があります。各ケースの終わりに。

于 2011-03-08T09:47:32.530 に答える
0

switch は奇妙な構造です。これは C から来ており、Java と C# も採用しているため、完全に「非オブジェクト指向」とは見なされません。

変化するスイッチオン状態は有効な OO の概念ですが、多くの場合、タイプに基づいた切り替えに使用されます。

特に、コンパイラは通常、「ジャンプ」テーブルを作成します。これは、ネストされた「if」ステートメントとは異なり、どのコードブロックが呼び出されるかが O(1) であることを意味します。複数の値 (デフォルトを除く) を同じポイントにジャンプさせることができるため、"break" ステートメントを明示的に挿入しない限り、コード ブロックは互いに "衝突" します。

これは C で行われた方法であり、C++ 用に保持されています。

スイッチの値に関しては、数値である必要がありますが、定数である必要はありません。あなたのケースi++では 0 に評価されますが、i が 1 にインクリメントされます。これは明確に定義された動作であり、シーケンス ポイントに関する問題はありません。

于 2011-03-08T10:41:58.860 に答える