【发布时间】:2018-04-14 15:57:24
【问题描述】:
根据this 问题,sizeof(true) 或sizeof(false) 是4 字节,因为true 和false 是宏并在#include <stdbool.h> 头文件中定义。
但是,这里有有趣的程序输出。
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool a = true;
printf("%zu\n", sizeof(a ? true : false, a));
/* ^^ -> expresion2 */
return 0;
}
输出(Live demo):
1
C11 6.5.15 条件运算符(P4):
计算第一个操作数;它之间有一个序列点 评估和第二个或第三个操作数的评估 (以评估为准)。 第二个操作数只有在 首先比较不等于0;仅在以下情况下评估第三个操作数 第一个比较等于 0; 结果是第二个的值 或第三个操作数(以被评估者为准),转换为类型 如下所述。110)
这里,a 是一个bool 类型和赋值true,然后在sizeof 运算符内部,conditional 运算符执行表达式2,因为a 是一个@ 987654337@。
所以,comma operator part(expression3) 没有根据标准进行评估,而 expression2 是一个宏。所以,根据那个问题,宏的输出是4字节,但在这里,程序的输出是1字节。
那么在这里,为什么sizeof(a ? true : false, a) 只打印1 字节?
【问题讨论】:
-
你用的是什么编译器?
gcc或g++?。准确给出你的编译命令 -
@Basile Starynkevitch GCC 编译器。
-
但是什么编译命令。
gcc和g++的行为不同 -
@BasileStarynkevitch 问题是用 c 标记...
-
尝试在
false,a周围加上括号 -->printf("%zu\n", sizeof(a ? true : (false, a)));,你会得到program - 4的输出。
标签: c boolean sizeof comma conditional-operator