2017-05-16 36 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"); 
}