为什么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?
