2017-05-16 40 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; 
} 

這個程序的輸出顯然是「假。\ n」。我有兩個問題:

  1. 如果條件語句的參數只是一個變量,這是什麼意思?
  2. 爲什麼輸出「False。\ n」?

謝謝!任何建議或提示的話,不勝感激。

+5

請閱讀任何基本的C書或教程。對於C基礎知識,這些是比Stackoverflow更好的資源。但是總而言之,C中的0是錯誤的,其他都是真的。結果是錯誤的,因爲'16 * 16'溢出了'char',因此結果爲0. – kaylum

+5

@kaylum它是'unsigned char'。而作爲'*'的操作數被提升爲'int'的超範圍賦值(不溢出)。 –

+2

[if語句整數]可能重複(http://stackoverflow.com/questions/14646718/if-statement-integer) – Dukeling

回答

4
unsigned char x = 16; 

xunsigned char,這是在範圍[0, 255]

x = x * 16; 

C99 standard§6.2.5/9)指出

涉及無符號的操作數的一種計算可以從未溢流,因爲不能由所得到的無符號整數類型所表示的結果是減少了模是一個更大的數而不是由最終類型表示的最大值。

x等於16 * 16 % 256 = 256 % 256 = 0

if (x) { 

對於不等於零的值,此語句應爲true。 對於等於零的值,此語句應爲false,這是您的情況。

3

x * 16不溢出。

x具有16的值作爲乘法的一部分,unsigned x被轉換爲int和代碼執行的int * int其產物是256 - 無溢出。

現在int 256被分配給unsigned char。當某些無符號整數類型被分配了一個超出其範圍的值時,該值以「最大+ 1」步長或256降低/增加,直到它在範圍內,因爲OP的平臺上的最大值爲unsigned char爲255.同樣,沒有溢出。值爲0.

如果條件語句的參數只是一個變量,這是什麼意思?
爲什麼輸出「False。\ n」?

if(something)如果something等於0,一切是真實

if (x) { 
// 
if (0) { 
// 
if (false) { 
    ... // irrelevant 
} else { 
    printf("False.\n"); 
}