switch 语句体由一系列 case 标签和一个可选 default 标签组成。 case 语句中的两个常量表达式的计算结果不能为同一个值。 default 标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch 语句是无意义的。默认语句(即default标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置。 case 或 default 标签只能显示在 switch ステートメント内。 抜粋: Microsoft Visual Studio 2015 C++ Switch ステートメントの公式ドキュメント
まず、switch で注意すべき点をいくつか明確にしましょう:
1.
switch
语句体由一系列case
标签和一个可选default
标签组成。case
语句中的两个常量表达式的计算结果不能为同一个值。default
标签只能出现一次。 标记语句不是语法要求,但如果它们不存在,switch
语句是无意义的。默认语句(即default
标签)无需显示在末尾;它可以显示在 switch 语句体的任何位置。case
或default
标签只能显示在switch
ステートメント内。抜粋: Microsoft Visual Studio 2015 C++ Switch ステートメントの公式ドキュメント
2.
上記の
case
和default
本身就是标签,就是告诉编译器从满足这个标签开始向后执行,之后不会再判断其他标签的正确性,直到break
语句或者switch
ステートメントの範囲は終了します。この問題について
ステップ 1 :
🎜ステップ 4🎜: i=3 の場合、i=1
の場合、i!=2&&i!=4
なので、default
タグの後に実行が開始されます。ステートメントc+=i;
を実行します (ここでは、コンパイラーが c を 0 に初期化すると仮定します。すべてのコンパイラーがそれほどフレンドリーであるわけではないことを知っておく必要があります) 実行後の c の値は 1 です。ステップ 2i=1
时,由于i!=2&&i!=4
故从default
标签后开始执行,此时执行语句c+=i;
(我们现在就假设编译器帮你把c初始化为0,要知道并不是所有的编译器都这么友好)执行后c的值为1;STEP 2:综合上述1,2可知由于此时没有碰到任何
break
语句也没有到switch
语句的作用域结束(因为这个default
语句是放在第一个的)所以它接着向后执行case 2
后的语句(此时编译器已经不看满不满足case
标签了)此时执行语句c++
;执行后c的值为2;遇到break
语句跳出switch
语句。STEP 3:当
i=2
时,由于i满足case 2
的情况,所以直接从case 2
便签后的语句开始执行,此时执行语句c++
,执行后c的值为3,遇到break
语句跳出switch
语句。STEP 4:当i=3时,跳出
for
: 上記 1 と 2 に基づいて、この時点ではbreak
ステートメントに遭遇しておらず、switch
ステートメントのスコープが終了していないことがわかります。 (このため、default
ステートメントが最初に配置されます)、その後、case 2
の後のステートメントが逆方向に実行されます (この時点では、コンパイラーはの条件を満たしていません) case
ラベル) このとき、c++
ステートメントが実行され、break
ステートメントが検出されると、c の値は 2 になります。 >switch文が飛び出しています。ステップ 3:
i=2
の場合、i はcase 2
の状況を満たしているため、case 2
の後のステートメントを直接続けます。 note 実行を開始します。この時点で、ステートメントc++
が実行されます。実行後の c の値は 3 です。break
ステートメントが検出されると、switch が実行されます。
文が飛び出しています。for
ループから抜け出して c=3 を出力します 🎜🎜 (上記のプロセスは、Visual Studio 2015 のシングルステップ デバッグを使用して私が導き出した結論です。データを結合します) 🎜 🎜i=1の場合、デフォルト: c=1に入り、ブレークがないため、ケース2と一致し続け、c=2ブレークを取得します
i=2の場合、最初にケース2と一致し、ケース2: c=3に入りますBreak
i=3の場合 サイクルが成立しません。
出力cは3です
リーリー