2017-05-16 5 views
2

私は最近コーディングが新しく、最近遭遇したプログラムの出力に関する質問がありました。コードは次のとおりです。if()のパラメータとしての変数

#include <stdio.h> 

int main(void) { 
    unsigned char x = 16; 
    x = x * 16; 

    if (x) { 
     printf("True.\n"); 
    } 
    else { 
     printf("False.\n"); 
    } 

    return 0; 
} 

このプログラムの出力は、明らかに「False。\ n」です。これに関する2つの質問があります。

  1. 条件文の引数が単純に変数であるとはどういう意味ですか?
  2. なぜ出力が「False。\ n」ですか?

ありがとうございました!アドバイスやヒントのすべての単語が大歓迎です。

+5

基本的なCの本またはチュートリアルをお読みください。それらはStackoverflowよりもCのファンダメンタルズのための優れたリソースです。しかし要約すると、0はCでは偽であり、それ以外は真です。 '16 * 16'が' char'をオーバーフローして結果が0になるので結果はfalseです。 – kaylum

+5

@kaylum 'unsigned char'です。 '*'のオペランドが 'int'に昇格されるので、範囲外の代入(オーバーフローではありません)が行われます。 –

+2

[if文の整数]の複製があります(http://stackoverflow.com/questions/14646718/if-statement-integer) – Dukeling

答えて

4
unsigned char x = 16; 

x範囲[0, 255]にある、unsigned charあります。

x = x * 16; 

C99 standard§6.2.5/9)は

符号なしオペランドを伴う計算を述べて缶決して超える流動、得られた符号なし整数型で表現できない結果を低減するためつ大きい数を法結果の型で表現できる最大値よりも大きくなります。

xは、16 * 16 % 256 = 256 % 256 = 0と等しい。

0以外の値の場合、このステートメントはtrueである必要があります。 値が0の場合、このステートメントはfalseでなければなりません。これがあなたのケースです。

3

x * 16はオーバーフローしません。無オーバーフロー -

xunsigned xintに変換されたコードは、その製品256 int * intを行い、乗算の一部として、16の値を有します。

int 256unsigned charに割り当てられています。一部の符号なし整数型に範囲外の値が割り当てられている場合、OPのプラットフォームのunsigned charの最大値が255であるため、値は「max + 1」ステップで縮小/増加し、範囲内になるまで256になります。オーバーフローはありません。値は0です。

条件文の引数が単純に変数であるとはどういう意味ですか?
なぜ出力が「False。\ n」ですか?

if(something)somethingが0に等しくならば、他のすべてがあるです。

if (x) { 
// 
if (0) { 
// 
if (false) { 
    ... // irrelevant 
} else { 
    printf("False.\n"); 
} 
関連する問題