私は次のコードを書きました:
int i = 0;
switch(i++)
{
case 0:
cout << 0;
case 1:
cout << 1;
}
cout << "\n" << i;
コードの出力は次のようになりました。
01
1
誰かが出力の最初の行を説明できますか?0と1の両方が印刷されるのはなぜですか?
私は次のコードを書きました:
int i = 0;
switch(i++)
{
case 0:
cout << 0;
case 1:
cout << 1;
}
cout << "\n" << i;
コードの出力は次のようになりました。
01
1
誰かが出力の最初の行を説明できますか?0と1の両方が印刷されるのはなぜですか?
まず、式i++
( post-increment operator ) は 0 に評価されます (ただし、値はi
1 に設定されます)。の中switch
で、case 0:
ブランチが選択されています。
次に、 のbreak
後にがないため、プログラムはラベルcase 0:
内のコードの実行を続行します。case 1:
要約すると、最初の分岐から 0、2switch
番目の分岐から 1、そして の最終値であるため、別の 1 になりますi
。
break
ケースごとにafterを追加する必要があるため、次のステートメントの実行が妨げられます。例えば
switch(i++)
{
case 0:
cout<<0;
break;
case 1:
cout<<1;
break;
}
確かに、2番目の休憩は不要ですが、一貫性を保つためにそこに配置しました
あなたは「休憩」を置く必要があります。各ケースの終わりに。
switch は奇妙な構造です。これは C から来ており、Java と C# も採用しているため、完全に「非オブジェクト指向」とは見なされません。
変化するスイッチオン状態は有効な OO の概念ですが、多くの場合、タイプに基づいた切り替えに使用されます。
特に、コンパイラは通常、「ジャンプ」テーブルを作成します。これは、ネストされた「if」ステートメントとは異なり、どのコードブロックが呼び出されるかが O(1) であることを意味します。複数の値 (デフォルトを除く) を同じポイントにジャンプさせることができるため、"break" ステートメントを明示的に挿入しない限り、コード ブロックは互いに "衝突" します。
これは C で行われた方法であり、C++ 用に保持されています。
スイッチの値に関しては、数値である必要がありますが、定数である必要はありません。あなたのケースi++
では 0 に評価されますが、i が 1 にインクリメントされます。これは明確に定義された動作であり、シーケンス ポイントに関する問題はありません。