为什么sizeof(a?true:false)给出了四个字节的输出?
我有一个关于sizeof
运算符和三元运算符的小代码:
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool a = true;
printf("%zun", sizeof(bool)); // Ok
printf("%zun", sizeof(a)); // Ok
printf("%zun", sizeof(a ? true : false)); // Why 4?
return 0;
}
输出(GCC):
1
1
4 // Why 4?
但在这儿,
printf("%zun", sizeof(a ? true : false)); // Why 4?
三元运算符返回boolean
类型,sizeof bool
类型在C中为1
个字节。
那么为什么sizeof(a ? true : false)
给出了四个字节的输出?
这是因为你有#include <stdbool.h>
。 这头文件定义的宏true
和false
是1
和0
,所以你的说法是这样的:
printf("%zun", sizeof(a ? 1 : 0)); // Why 4?
sizeof(int)
在你的平台上是4。
这里,三元运算符返回boolean
类型,
好的,还有更多!
在C中, 这个三元操作的结果是int
类型的。 [下面的注释(1,2)]
因此,结果与您的平台上的表达式sizeof(int)
相同。
注1:引用C11
,章节§7.18, Boolean type and values <stdbool.h>
[....]其余三个宏适用于#if
预处理指令。 他们是
true
其展开为整数常数1,
false
扩展为整数常量0,[...]
注2:对于条件操作符,章节§6.5.15(强调我的)
第一个操作数被评估; 在其评估和第二或第三操作数的评估之间有一个顺序点(以评估者为准)。 第二个操作数仅在第一个操作数比较不等于0时进行评估; 第三个操作数仅在第一个比较等于0时才被评估; 结果是第二个或第三个操作数的值(以评估者为准), [...]
和
如果第二个和第三个操作数都具有算术类型,则将由通常的算术转换确定的结果类型应用于这两个操作数,结果的类型就是这些类型。 [....]
因此,结果将是整数类型,并且由于值的范围,这些常量正好是int
类型的。
也就是说,一个通用的建议, int main()
最好是int main (void)
以确保符合标准。
三元运算符是一个红鲱鱼。
printf("%zun", sizeof(true));
打印4(或任何sizeof(int)
在您的平台上)。
以下假定bool
是char
或类似大小1的同义词,并且int
大于char
。
sizeof(true) != sizeof(bool)
和sizeof(true) == sizeof(int)
很简单,因为true
不是一个bool
类型的表达式。 这是一个int
类型的表达式。 在stdbool.h
#define
d为1
。
C中根本没有类型bool
右bool
。 即使用作sizeof
的参数,每个这样的右值都会立即提升为int
。 编辑:这段不是真的, sizeof
参数不会被提升为int
。 尽管如此,这并不影响任何结论。
上一篇: Why does sizeof(a ? true : false) give an output of four bytes?