根据这个问题,sizeof(true)
或sizeof(false)
是4
字节,因为true
和false
是宏,并在#include <stdbool.h>
头文件中定义。
但是,这里有有趣的程序输出。
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool a = true;
printf("%zun", sizeof(a ? true : false, a));
/* ^^ -> expresion2 */
return 0;
}
输出(现场演示):
1
C11 6.5.15 条件运算符(P4):
计算第一个操作数;在其 评估和第二或第三操作数的评估 (以评估者为准)。仅当 首先比较不等于 0;仅当以下情况下计算第三个操作数 第一个比较等于 0;结果是秒的值 或第三个操作数(以计算者为准),转换为类型 描述如下.110)
这里,a
是bool
类型和赋值true
,那么在sizeof
运算符内部,conditional
运算符执行了expression2,因为a
是一个true
。
因此,comma
运算符部分(表达式 3) 未根据标准计算,表达式 2 是一个宏。因此,根据该问题,宏的输出是4
字节,但在这里,程序的输出是 1 个字节。
那么在这里,为什么sizeof(a ? true : false, a)
只打印1
字节?
a ? true : false, a
是两个表达式,由逗号运算符分隔。它丢弃三元运算符的结果,并简单地计算a
。
由于a
是一个bool
,在stdbool.h
中是_Bool
的宏,所以打印_Bool
数据类型的大小。_Bool
很可能只是一个字节,因为它只需要保存值 1 和 0。
为了将其与链接的问题进行对比,您在那里打印了true
和false
,stdbool.h
将其定义为 1 和 0 的预处理器宏。这两个是int
常量,因此它们的大小是int
数据类型的大小。
对于初学者,请考虑以下简单的演示程序
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
printf( "sizeof( _Bool ) = %zun", sizeof( _Bool ) );
printf( "sizeof( bool ) = %zun", sizeof( bool ) );
return 0;
}
它的输出是
sizeof( _Bool ) = 1
sizeof( bool ) = 1
根据C标准(7.18布尔类型和值)
2 宏
bool
扩展到_Bool。
现在让我们考虑此调用中sizeof
运算符中使用的表达式
printf("%zun", sizeof(a ? true : false, a));
根据 C 标准(6.5.15 条件运算符)
语法
1 conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
也就是说,条件运算符的优先级高于逗号运算符。
所以这个表达
a ? true : false, a
是带有逗号运算符的表达式,可以等效地重写,例如
( a ? true : false ) , ( a )
表达式的结果是逗号运算符的第二个操作数,即表达式( a )
。
如上所示,此表达式的类型为_Bool
,因为变量 a 被声明为
bool a = true;
其中宏bool
扩展到_Bool
.所以sizeof( _Bool )
等于 1。
如果要按以下方式重写条件运算符,如本调用所示
printf( "%zun", sizeof( a ? true : a ) );
然后输出将等于sizeof( int )
返回的值(通常等于4
),因为类型_Bool
的秩小于类型int
(扩展宏true
的常量整数文本的类型),因此表达式a
将隐式转换为类型int
由于整数提升。
由于表达式中使用的逗号运算符,您正在1
:
(a ? true : false, a));
逗号运算符:
在 C 和C++编程语言中,逗号运算符(由标记 表示)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。
因此,在表达式(a ? true : false, a));
中,由于逗号运算符,三元运算符的结果被丢弃,然后它计算第二个操作数并返回a
。由于a
属于bool
类型,因此您的程序将输出为sizeof(bool)
1
。
尝试在false,a
两边加上括号,如下所示:
printf("%zun", sizeof(a ? true : (false, a)));
当你把表达式false, a
放在括号()
时,表达式(false, a)
将首先被计算,逗号运算符返回a
但三元运算符将计算表达式并返回true
,这是一个宏扩展到整数常量1,程序的输出将被sizeof(1)
即4
.
维基中的第一个语句
"在C和C++编程语言中,逗号运算符 (由令牌表示)是一个二进制运算符,用于计算其 第一个操作数并丢弃结果">
所以本质上
printf("%zun", sizeof(a ? true : false, a));
评估结果为
printf("%zun", sizeof(a));
A 是布尔类型,其余是您作为输出获得的。