C 变量作为if()的参数
我对编码相当陌生,对最近遇到的一个程序的输出有疑问。代码如下:C 变量作为if()的参数,c,if-statement,output,C,If Statement,Output,我对编码相当陌生,对最近遇到的一个程序的输出有疑问。代码如下: #include <stdio.h> int main(void) { unsigned char x = 16; x = x * 16; if (x) { printf("True.\n"); } else { printf("False.\n"); } return 0; } #包括 内部主(空){ 无符号字符x=16;
#include <stdio.h>
int main(void) {
unsigned char x = 16;
x = x * 16;
if (x) {
printf("True.\n");
}
else {
printf("False.\n");
}
return 0;
}
#包括
内部主(空){
无符号字符x=16;
x=x*16;
if(x){
printf(“True.\n”);
}
否则{
printf(“False.\n”);
}
返回0;
}
此程序的输出明显为“False”。\n。关于这一点,我有两个问题:
unsigned char x = 16;
x
是一个无符号字符
,其范围为[0255]
x = x * 16;
(§6.2.5/9
)规定
涉及无符号操作数的计算永远不会过流,因为不能由结果无符号整数类型表示的结果将以大于结果类型可以表示的最大值一的数字的模减少
x
等于16*16%256=256%256=0
if (x) {
对于不等于零的值,此语句应为true
。
对于等于零的值,此语句应为
false
,这是您的情况。x*16
不会溢出
x
的值为16。作为乘法的一部分,unsigned x
被转换为int
,代码执行一个乘积为256的int*int
,无溢出
现在int256
被分配给一个无符号字符
。当为某个无符号整数类型分配了一个超出其范围的值时,该值将以“max+1”的步长减小/增大,或以256的步长减小/增大,直到其位于范围内,因为OP平台上的无符号字符的最大值为255。同样,没有溢出。该值为0
如果条件语句的参数只是一个变量,这意味着什么
为什么输出为“False”。\n”
如果(某物)
等于0,则if(something)
为假,否则为真
请阅读任何基本的C语言书籍或教程。与Stackoverflow相比,这些是更好的C基础知识资源。但总的来说,0在C中是假的,其他任何东西都是真的。结果为false,因为
16*16
溢出了char
,因此结果为0。@kaylum它是无符号char
。当*
的操作数升级为int
时,赋值超出范围(非溢出)。Tryprintf可能重复(“%d\n”,(int)x)代码>您将发现它打印0。
if (x) {
//
if (0) {
//
if (false) {
... // irrelevant
} else {
printf("False.\n");
}