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

msc*_*msc -1 c boolean sizeof comma conditional-operator

根据这个问题,sizeof(true)或者sizeof(false)4字节,因为truefalse是宏并在#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;
}
Run Code Online (Sandbox Code Playgroud)

输出(现场演示):

1
Run Code Online (Sandbox Code Playgroud)

C11 6.5.15条件运算符(P4):

第一个操作数被评估; 在其评估与第二或第三操作数的评估之间存在一个序列点(以评估者为准).仅当第一个操作数不等于0时才评估第二个操作数; 仅当第一个操作数比较等于0时才评估第三个操作数; 结果是第二个或第三个操作数的值(无论哪个被评估),转换为下面描述的类型.110)

这里a是一个bool类型和赋值true,然后在sizeof运算符内,运算conditional符执行expression2因为a是a true.

因此,comma运算符部分(表达式3)未根据标准进行评估,而表达式2是宏.所以,根据那个问题,宏的输出是4字节,但在这里,程序的输出是1字节.

那么,为什么 只sizeof(a ? true : false, a)打印1字节?

Sto*_*ica 10

a ? true : false, a是两个表达式,由逗号运算符分隔.它丢弃三元运算符的结果并简单地评估a.

因为a是a bool,它stdbool.h是一个宏_Bool,你打印_Bool数据类型的大小.它很可能_Bool只是一个字节,因为它需要保持的是值1和0.

为了与链接的问题进行对比,你打印了truefalse,它stdbool.h定义为1和0的预处理器宏.这两个是int常量,因此它们的大小是int数据类型的大小.


Vla*_*cow 7

首先考虑以下简单的演示程序

#include <stdio.h>
#include <stdbool.h>

int main(void) 
{
    printf( "sizeof( _Bool ) = %zu\n", sizeof( _Bool ) );
    printf( "sizeof( bool )  = %zu\n", sizeof( bool ) );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的输出是

sizeof( _Bool ) = 1
sizeof( bool ) = 1
Run Code Online (Sandbox Code Playgroud)

根据C标准(7.18布尔类型和值)

2宏

bool
Run Code Online (Sandbox Code Playgroud)

扩展为_Bool.

现在让我们考虑一下sizeof这个调用中运算符中使用的表达式

printf("%zu\n", sizeof(a ? true : false, a));
Run Code Online (Sandbox Code Playgroud)

根据C标准(6.5.15条件运算符)

句法

1 conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression
Run Code Online (Sandbox Code Playgroud)

这就是条件运算符的优先级高于逗号运算符.

所以这个表达

a ? true : false, a
Run Code Online (Sandbox Code Playgroud)

是逗号运算符的表达式,可以等效地重写

( a ? true : false ) , ( a )
Run Code Online (Sandbox Code Playgroud)

表达式的结果是逗号运算符的第二个操作数,即表达式( a ).

如上所示,此表达式具有类型,_Bool因为变量a被声明为

bool a = true;
Run Code Online (Sandbox Code Playgroud)

bool扩展到的地方_Bool.所以sizeof( _Bool )等于1.

如果您将按照以下方式重写条件运算符,如此调用中所示

printf( "%zu\n", sizeof( a ? true : a ) );
Run Code Online (Sandbox Code Playgroud)

然后输出将等于返回的值sizeof( int )(通常等于4),因为类型的_Bool排名低于类型int(扩展宏的常量整数文字的类型true),因此表达式a将被immfly转换为类型int由于整数促销.