2017-02-25 9 views
2

重複するケースを含む以下のコード(C言語)を検討してください。コンパイラは今回は何の警告もエラーも出さない。データタイプとswitch-caseステートメントの解決

void testSwitchCase() { 
char d = 0; 
switch(d) { 
    case 'a' + 'b': 
     printf("I am case 'a' + 'b'\n"); 
     break; 
    case 'a' + 'b': 
     printf("I am case 'a' + 'b' \n"); 
     break; 
    } 
} 

しかし、私はint d = 0char d = 0を変更した場合、コンパイラは、重複したケースに関するエラーを上げ開始します。

error: duplicate case value

は私が表現'a' + 'b'intに評価すべきであることを理解しますが、私のポイントは、それが重複した場合のエラーの両方の時間を上げるべきであるということです。それはなぜですか?

+0

どのコンパイラを使用していますか? 2つの異なるコンパイラでこれを実行しようとしましたか? – Daniel

+0

gcc 32ビット。 codeblocks-16.01mingwには、GCC/G ++コンパイラが含まれています。オンラインコンパイラを試してみましょう。 –

答えて

6

この動作の理由は、システム上の値が'a'+'b'であり、ASCIIコード化されたシステムでは195です。これは127を超えており、システム上ではcharという最高値で、にはという文字が割り当てられています。したがって、コンパイラは安全に両方のラベルを無視しますcaseラベル。

195intの範囲内であるため、コンパイラは無視できなくなるため、重複した大文字小文字のエラーが発生する必要があります。あなたは'a'+'b''0'+'1'に変更した場合は

、あなたがsigned char型の範囲内である、97を取得し、あなたにもchar dと重複した場合のエラーを取得:

char d = 0; 
switch(d) { 
case '0' + '1': 
    printf("I am case 'a' + 'b'\n"); 
    break; 
case '0' + '1': 
    printf("I am case 'a' + 'b' \n"); 
    break; 
} 

Demo.

+0

ええ、それを逃した。今それを得た。ありがとう:) –

0

重複したケースエラーとは、switch文で同じ値を持つ2つのケースを定義したことを意味します。あなたはおそらくあなたのコードを考えているのですが "彼らはすべて異なっています"。あなたには彼らは異なっています。コンパイラには、はるかに異なって見えます。

文字表記を使用してcase文を定義しました。一重引用符は、文字列ではなく文字列を意味します。

+3

私はOPがこれをすべて知っていると確信しています。彼の質問の最後の段落を見てください。 – dasblinkenlight

+0

彼は文字を求めています。スイッチの式を見てください。そして彼は彼らがすべて同じだと思うが、dをintに変えない限り警告を受けない。 – Gerhardh

+0

あなたの誤解は、switch()構造体とは何の関係もありません。一重引用符についてのものです.1を書くと、値1の整数が得られます。一重引用符 '1'にすると、数字1のASCII文字の数値です(これは少し不正確です、下記の注を参照してください)。そのASCII文字は、0x31の数値、または小数点の49を持ちます。違いを想像してみましょう。 – Siddhesh

1

はあまりにも時間がかかりましたあまりにも遅く投稿しました:P ...

私の推測は次のようになります: char変数は 'a' + 'b'を保持できません。これはカウオーバーフロー、すなわち未定義の挙動。 しかし、 'a' + 'b'は整数昇格規則のためintに昇格されます。 char dはこの値と等しくなることはなく、コンパイラはこれらのケースを完全に削除します。 int dは両方の場合と等しくなり、コンパイラはエラーを発行します。

関連する問題