2

皆さん、

最近 C を学び始め
ました。switch-case ステートメントの動作についてです。

コードは次のとおりです。

#include<stdio.h>

int main() {
        int i=4;
        switch(i) {

                default :       
                        printf("%s","Default");
                case 0:         
                        printf("%s","Case 0");
                case 1:         
                        printf("%s","Case 1");
                case 2:         
                        printf("%s","Case 2");

        return 0;
        }
 }  

Default個人的には、大文字と小文字の値のいずれとも一致しないため、「 」を出力する必要があると思います。
しかし、Turbo C でコードを実行すると、次のことがわかりました。

Default
Case 0
Case 1
Case 2  

ここでも同じことが観察されました:http://www.ideone.com/pFh1d

何が問題ですか ?それはコンパイラの問題ですか、それとも私のコードの間違いですか?


編集 :

PS:デフォルトのケースを最初に書かなければならない場合、それはどのような問題を引き起こしますか。害はありますか?

しかし、コンパイラが default ステートメントを実行する必要があることを認識したら、なぜ default ケースのステートメントの後に break ステートメントを配置する必要があるのでしょうか?

4

5 に答える 5

7

switch ステートメントは適切なcaseorにジャンプし、コードは次のステートメントdefaultまで続きます。break

コードには no がbreakあるため、 から始まりdefault:、次のすべてのステートメントを単純に続けます。これは、同様の条件をプログラミングするときに便利なトリックになることがありますが、通常、break ステートメントがないと混乱を招きます。

また、ファイナルreturnは、switch ステートメントの後にあるはずの間違った場所にあります。

以下のように修正します。

        int i=4;
        switch(i) {

                default :       
                        printf("%s","Default");
                        break;
                case 0:         
                        printf("%s","Case 0");
                        break;
                case 1:         
                        printf("%s","Case 1");
                        break;
                case 2:         
                        printf("%s","Case 2");
                        break;

        }
        return 0;
于 2011-04-25T07:41:26.287 に答える
2

しかし、コンパイラが default ステートメントを実行する必要があることを認識したら、なぜ default ケースのステートメントの後に break ステートメントを配置する必要があるのでしょうか?

それが言語の仕組みだからです。言語の標準では、一致する case-label から実行を続行する必要があると規定されています。breakcase. _ もしそうなら、これを行うことはできません:

switch(x){
case 1:
case 2:
case 3:
 // do something
 break;
case 4:
 // do something else
 break;
default:;
}

コンパイラがbreak各ケースの後に a を追加した場合、上記のコードを次のように書き直す必要があります。

  switch(x){
case 1:
 // do something
case 2:
 // do the same thing
case 3:
 // do the same thing
case 4:
 // do something else
default:
}
于 2011-04-25T09:07:55.673 に答える
1

switchC 言語のステートメントの本体は、複数のエントリ ポイントを持つ1 つの連続した複合ステートメントです。case/defaultラベルはエントリ ポイントです。任意のエントリ ポイントでその複合ステートメントを入力でき、最後まで実行し続けます (もちろん、別の jump ステートメントが介入しない限り)。つまり、caseラベルはラベルswitchと同じように機能gotoします。この点では、ラベルdefaultはラベルと何の違いもありませんcase

これはまさに実験で観察したことです。switchあなたの外見の声明は次のとおりです

{
  printf("%s","Default");
  printf("%s","Case 0");
  printf("%s","Case 1");
  printf("%s","Case 2");
  return 0;
}

このステートメントdefault:は、最初にレーベルを通じて入力します。本体に入った後に制御フローを変更しないためswitch(おそらく間違って配置された final を除いてreturn)、4 つすべてprintfが "fire" に変更されます。

「しかし、コンパイラーがデフォルトのステートメントを実行する必要があることを知ったら...」で始まる質問の意味は、私には明確ではありません。switch/caseCでのコンストラクトの機能は、上で説明したとおりです。それが「コンパイラが知っている」ことです。一方、あなたはswitch/case、コンパイラが同じ誤解に従うことを何らかの理由で期待していることについて、完全に根拠のない自己発明の誤解に従っているようです。さまざまな言語要素が何をするかを推測しようとするのではなく、C 言語の基本に関する本を読む必要があると思います。

最初に主張することは何も悪いことではありませんdefault。上記のことを考えると、状況によっては、ステートメント内のラベルの順序が重要になります。それが重要な場合は、意図に従ってそれらを配置する必要があります。defaultケースを最初にする必要がある場合は、最初に作成します。必要ない場合 (または違いがない場合) は、最後に配置するか、他のどこにでも配置できます。

于 2011-04-25T07:41:25.967 に答える
1

標準によると、デフォルトのケースであっても、プログラマは各ケースの後に手動でブレークを配置する必要があります。プログラマーが配置されていない場合、ブレークは、そのケース以下のすべてのケースを実行することを意味します。標準では、このタイプのスイッチ プログラミングをスイッチ内の FALL THROUGH 条件と呼んでいます。

于 2016-06-02T12:31:42.233 に答える
1

デフォルトと一致したため、デフォルトで、break;実行されたすべてのケースがないため

期待される結果を得るには、次のようにします

 default :       
                        printf("%s","Default"); break;
                case 0:         
                        printf("%s","Case 0");break;
                case 1:         
                        printf("%s","Case 1");break;
                case 2:         
                        printf("%s","Case 2");break;
于 2011-04-25T07:34:08.040 に答える