c语言 - 为什么 sizeof(a ? true : false, a) 运算符打印一个字节?



根据这个问题,sizeof(true)sizeof(false)4字节,因为truefalse是宏,并在#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)

这里,abool类型和赋值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。

为了将其与链接的问题进行对比,您在那里打印了truefalsestdbool.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 是布尔类型,其余是您作为输出获得的。

相关内容

  • 没有找到相关文章

最新更新