2010-12-31 16 views
-2
main() 
{ 
    int x=12; 
    unsigned int y=12; 

    if (x>y) 
    { 
     printf("abc"); 
    } 
    else 
    { 
     printf("xyz"); 
    } 
} 

出力は何ですか?int内の符号なし整数

+10

コードをコンパイルしてチェックしてみませんか? – pablochan

+0

私はそれがxyzを印刷すると思う – shankhan

+0

それをコンパイルし、それを実行して参照してください!あるいは、12> 12か、同じ整数値の符号付きまたは符号なしの型が(コンパイラの警告が出力される以外の)違いがあると思いますか? – Clifford

答えて

3

そのコードはコンパイルされません。 、エラーを修正した後signed 12unsigned 12より大きくないので、期待されているプログラムの出力xyzを、

foo.cpp: In function ‘int main()’: 
foo.cpp:1: error: ‘printf’ was not declared in this scope 
foo.cpp:1: error: ‘printf’ was not declared in this scope 
foo.cpp:1: error: expected ‘}’ at end of input 

:それは価値がある何のために、私のコンパイラは、次の出力が得られます。

+0

ありがとうございます............ int x = -2の場所にint x = 12を書くとどうなりますか –

+0

これはC++コンパイラを使用しているためですが、質問にタグが付けられていますCでは、Cコンパイラを使うべきです。 – dreamlax

+0

@dreamlax、実際には、質問に答えたときに 'output'タグを付けました:) –

3

注::この回答はC99固有のものです。

mainの戻り値の型がありません(intである必要があります)。したがって、コードをコンパイルしないでください。関数スコープの関数プロトタイプなしに関数への呼び出しについて - <stdio.h>

J.2 未定義の挙動を

が不足しているため

さらに

int main() 
{ 
    int x=12; 
    unsigned int y=12; 

    if (x>y) 
    { 
     printf("abc"); 
    } 
    else 
    { 
     printf("xyz"); 
    } 
} 

はUBを呼び出しプロトタイプが省略記号で終わっているか、promの後ろにある引数の型パラメータの型(6.5.2.2)と互換性がありません。

+0

それは本当にUBですか、それとも単なるコンパイルエラーですか? – Falmarri

+0

ああ、あなたはprintfではなくmainを指していた。 – Falmarri

+1

@ファルマリ:そのUB。 UBは、何かが起こりうることを意味し、それにはコンパイラエラーも含まれます。 –

4

コンパイラエラーを修正した後、intを締結することは、通常の算術変換の規則(C99§6.3.1.8)に、符号無しに変換される:

そうでなければ、もし を有するオペランド符号なし整数型のランクが より大きいか、または他のオペランドのタイプが のランクに等しい場合、符号付き整数型のオペランド は、 の符号なし整数型 の型に変換されます。

12がunsigned intの範囲内にあるため、ここで期待どおりに動作します。

ただし、あなたのコメントでx = -2;を使用すると、-2 + UINT_MAX(§6.3.1.3、符号付きおよび符号なし整数)に変換されます。

-2 + UINT_MAX > 12が該当するので、abcが印刷されます。

1

ライブラリファイルをインクルードしていると仮定すると、コンパイラを厳密な動作に設定しない限り、main型の戻り値は必要ありません。そう厳密に!最終的な結果は次のようになり、あなたが動作するようにコンパイラを設定していない別の仮定を作る

XYZ

@Matthew Flaschenは、変換後、両方が同じように最初の条件は文句を言わない満たされると、それは行くと言ったように他の部分で。

1

符号付き/符号なしの不一致を示すコンパイラの警告が表示されますが、値が一定であるとコンパイラが判断した場合、最適化される可能性があります。