なぜこのコードは 3 なのでしょうか?初めて i が 1 のときは、default: c =i; が使用され、2 回目の i が 2 のときは、case 2: c ;break; が使用されるケースではないでしょうか? それで終了し、c=結(jié)局2が出力されるのか?なぜ 3 なのでしょうか?
歡迎選擇我的課程,讓我們一起見證您的進(jìn)步~~
まず、switch で注意すべき點(diǎn)をいくつか明確にしましょう:
switch
語句體由一系列 case
標(biāo)簽和一個(gè)可選 default
標(biāo)簽組成。 case
語句中的兩個(gè)常量表達(dá)式的計(jì)算結(jié)果不能為同一個(gè)值。 default
標(biāo)簽只能出現(xiàn)一次。 標(biāo)記語句不是語法要求,但如果它們不存在,switch
語句是無意義的。默認(rèn)語句(即default
標(biāo)簽)無需顯示在末尾;它可以顯示在 switch 語句體的任何位置。 case
或 default
標(biāo)簽只能顯示在 switch
ステートメント內(nèi)。
抜粋: Microsoft Visual Studio 2015 C++ Switch ステートメントの公式ドキュメント
上記の case
和default
本身就是標(biāo)簽,就是告訴編譯器從滿足這個(gè)標(biāo)簽開始向后執(zhí)行,之后不會(huì)再判斷其他標(biāo)簽的正確性,直到break
語句或者switch
ステートメントの範(fàn)囲は終了します。
ステップ 1 : i=1
の場合、i!=2&&i!=4
なので、default
タグの後に実行が開始されます。ステートメント c+=i;
を?qū)g行します (ここでは、コンパイラーが c を 0 に初期化すると仮定します。すべてのコンパイラーがそれほどフレンドリーであるわけではないことを知っておく必要があります) 実行後の c の値は 1 です。ステップ 2i=1
時(shí),由于i!=2&&i!=4
故從default
標(biāo)簽后開始執(zhí)行,此時(shí)執(zhí)行語句c+=i;
(我們現(xiàn)在就假設(shè)編譯器幫你把c初始化為0,要知道并不是所有的編譯器都這么友好)執(zhí)行后c的值為1;
STEP 2:綜合上述1,2可知由于此時(shí)沒有碰到任何break
語句也沒有到switch
語句的作用域結(jié)束(因?yàn)檫@個(gè)default
語句是放在第一個(gè)的)所以它接著向后執(zhí)行case 2
后的語句(此時(shí)編譯器已經(jīng)不看滿不滿足case
標(biāo)簽了)此時(shí)執(zhí)行語句c++
;執(zhí)行后c的值為2;遇到break
語句跳出switch
語句。
STEP 3:當(dāng)i=2
時(shí),由于i滿足case 2
的情況,所以直接從case 2
便簽后的語句開始執(zhí)行,此時(shí)執(zhí)行語句c++
,執(zhí)行后c的值為3,遇到break
語句跳出switch
語句。
STEP 4:當(dāng)i=3時(shí),跳出for
: 上記 1 と 2 に基づいて、この時(shí)點(diǎn)では break
ステートメントに遭遇しておらず、switch
ステートメントのスコープが終了していないことがわかります。 (このため、default
ステートメントが最初に配置されます)、その後、case 2
の後のステートメントが逆方向に実行されます (この時(shí)點(diǎn)では、コンパイラーは の條件を満たしていません) case
ラベル) このとき、c++
ステートメントが実行され、break
ステートメントが検出されると、c の値は 2 になります。 >switch文が飛び出しています。
ステップ 3: i=2
の場合、i は case 2
の狀況を満たしているため、case 2
の後のステートメントを直接続けます。 note 実行を開始します。この時(shí)點(diǎn)で、ステートメント c++
が実行されます。実行後の c の値は 3 です。break
ステートメントが検出されると、switch が実行されます。
文が飛び出しています。
for
ループから抜け出して c=3 を出力します ???? (上記のプロセスは、Visual Studio 2015 のシングルステップ デバッグを使用して私が導(dǎo)き出した結(jié)論です。データを結(jié)合します) ?? ??i=1の場合、デフォルト: c=1に入り、ブレークがないため、ケース2と一致し続け、c=2ブレークを取得します
i=2の場合、最初にケース2と一致し、ケース2: c=3に入りますBreak
i=3の場合 サイクルが成立しません。
出力cは3です