代码之家  ›  专栏  ›  技术社区  ›  msc

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

  •  -1
  • msc  · 技术社区  · 7 年前

    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 类型和赋值 真的 ,然后在 sizeof 操作员 conditional 操作员已执行 表达式2 因为 是一个 真的 .

    所以 comma 操作员部分(表达式3)未根据标准进行评估,表达式2为宏。因此,根据这个问题,宏观的输出是 4. 但是在这里,程序的输出是1字节。

    那么在这里,为什么 sizeof(a ? true : false, a) 印刷的 1 仅字节?

    4 回复  |  直到 2 年前
        1
  •  10
  •   StoryTeller - Unslander Monica    7 年前

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

    是一个 bool ,其中 stdbool.h 是的宏 _Bool _布尔 数据类型。很可能是这样的 _布尔 只有一个字节,因为它只需要保存值1和0。

    为了与链接的问题进行对比,您打印了 true false 哪一个 stdbool。h 定义为1和0的预处理器宏。这两个是 int 常数,因此它们的大小是 整数 数据类型。

        2
  •  7
  •   Vlad from Moscow    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;
    }
    

    其输出为

    sizeof( _Bool ) = 1
    sizeof( bool ) = 1
    

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

    2宏观

    bool
    

    扩展到\u Bool。

    现在让我们考虑一下 sizeof 本次通话中的接线员

    printf("%zu\n", 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

    bool a = true;
    

    其中宏 bool 扩展到 _布尔 . 所以 sizeof( _Bool ) 等于1。

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

    printf( "%zu\n", sizeof( a ? true : a ) );
    

    sizeof( int ) (通常等于 4 )因为类型 _布尔 等级低于类型 int (扩展宏的常量整数文字的类型 true )结果是表达式 a 将隐式转换为类型 整数 由于整数促销。

        3
  •  1
  •   H.S.    7 年前

    你正在得到 1 由于表达式中使用了逗号运算符:

    (a ? true : false, a));
    

    Comma operator :

    在C和C++编程语言中,逗号运算符(由标记表示)是一个二进制运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。

    所以,在表达上 (a ? true : false, a)); 由于逗号运算符,三元运算符的结果被丢弃,然后它计算第二个操作数并返回 a . 自从 属于类型 bool 因此,您的程序将输出为 sizeof(bool) 这就是 1. .

    试着用括号括起来 false,a ,如下所示:

    printf("%zu\n", sizeof(a ? true : (false, a)));
    

    当你把表达式 false, a 括号内 () 表示 (false, a) true ,它是一个宏,扩展为整数常数1,程序的输出将为 sizeof(1) 4 .

        4
  •  0
  •   asio_guy    7 年前

    中的第一个语句 Wiki

    在C和C++编程语言中,逗号运算符 (由标记表示)是一个二进制运算符,用于计算其 第一个操作数并丢弃结果“

    所以本质上

    printf("%zu\n", sizeof(a ? true : false, a));
    

    评估结果为

    printf("%zu\n", sizeof(a));
    

    a是bool类型,rest是作为输出得到的。