为什么sizeof(a?true:false)给出了四个字节的输出?

我有一个关于sizeof运算符和三元运算符的小代码:

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

int main()
{
    bool a = true;
    printf("%zun", sizeof(bool));  // Ok
    printf("%zun", sizeof(a));     // Ok
    printf("%zun", sizeof(a ? true : false)); // Why 4?
    return 0;
}

输出(GCC):

1
1
4 // Why 4?

但在这儿,

printf("%zun", sizeof(a ? true : false)); // Why 4?

三元运算符返回boolean类型,sizeof bool类型在C中为1个字节。

那么为什么sizeof(a ? true : false)给出了四个字节的输出?


这是因为你有#include <stdbool.h> 。 这头文件定义的宏truefalse10 ,所以你的说法是这样的:

printf("%zun", sizeof(a ? 1 : 0)); // Why 4?

sizeof(int)在你的平台上是4。


这里,三元运算符返回boolean类型,

好的,还有更多!

在C中, 这个三元操作的结果是int类型的。 [下面的注释(1,2)]

因此,结果与您的平台上的表达式sizeof(int)相同。


注1:引用C11 ,章节§7.18, Boolean type and values <stdbool.h>

[....]其余三个宏适用于#if预处理指令。 他们是

true

其展开为整数常数1,

false

扩展为整数常量0,[...]

注2:对于条件操作符,章节§6.5.15(强调我的)

第一个操作数被评估; 在其评估和第二或第三操作数的评估之间有一个顺序点(以评估者为准)。 第二个操作数仅在第一个操作数比较不等于0时进行评估; 第三个操作数仅在第一个比较等于0时才被评估; 结果是第二个或第三个操作数的值(以评估者为准), [...]

如果第二个和第三个操作数都具有算术类型,则将由通常的算术转换确定的结果类型应用于这两个操作数,结果的类型就是这些类型。 [....]

因此,结果将是整数类型,并且由于值的范围,这些常量正好是int类型的。

也就是说,一个通用的建议, int main()最好是int main (void)以确保符合标准。


三元运算符是一个红鲱鱼。

    printf("%zun", sizeof(true));

打印4(或任何sizeof(int)在您的平台上)。

以下假定boolchar或类似大小1的同义词,并且int大于char

sizeof(true) != sizeof(bool)sizeof(true) == sizeof(int)很简单,因为true 不是一个bool类型的表达式。 这是一个int类型的表达式。 在stdbool.h #define d为1

C中根本没有类型boolbool 。 即使用作sizeof的参数,每个这样的右值都会立即提升为int 。 编辑:这段不是真的, sizeof参数不会被提升为int 。 尽管如此,这并不影响任何结论。

链接地址: http://www.djcxy.com/p/3585.html

上一篇: Why does sizeof(a ? true : false) give an output of four bytes?

下一篇: arr)[0] compile and equal sizeof(my