为什么 sizeof(!5.6) 的输出结果是 2?

4
即使我们声明 float a=5.6,然后执行 printf("%d",sizeof(!a)),输出结果为2
为什么会输出整数的大小?

2
在这个上下文中,! 做什么? - Lasse V. Karlsen
3
@Alex 你怎么确定那是真的? - Theodoros Chatzigiannakis
3
@Alex: 我正在使用16位环境。 - Heisenberg
6
看到有人坚称sizeof(int)不可能是2,让人感到害怕。 - sh1
2
我知道,我希望原帖作者能够找出问题所在。 - Lasse V. Karlsen
显示剩余3条评论
4个回答

10

! 运算符返回一个整型,可能是 int。在你的体系结构上,sizeof(int) == 2


3
这不是真的,因为这是一个C语言问题。在C语言中,! 返回一个整数型变量。 - Xie
糟糕,我错了,这是C语言而不是C++。我已经修改了我的回答以反映这一点。 - PfhorSlayer
5
自1999年以来,@Dibya C一直有bool类型。 - Casey
1
@Casey:那是库类型,而不是基本类型。基本布尔类型是_Bool。 - rubenvb
只有在特定的头文件中才能使用@H2CO3。因此,它是“库类型”。如果您忘记包含头文件,则编译器会报错。 - rubenvb

3
! 运算符不会返回操作数的类型。如果对 float 执行 NOT 运算,你将不会得到一个 float,而是会得到一个逻辑上相反的值为初始 floatint

你确定这就是发生的事情吗?难道你不认为它会先执行一个隐式转换成整数吗? - Tommy Andersen
1
@TommyA 首先,"implicit cast" 这个概念是不存在的,这是自相矛盾的。按照定义,cast 必须是显式的。显式类型转换 = 类型转换,隐式类型转换 = 类型提升或类型强制转换。其次,没有隐式转换。浮点数 0.1 被认为是 true 是因为它不是零,尽管如果它在转换为整数类型(截断)之前会变成零。 (教训:如果你不懂 C 语言等相关知识,请不要教给别人。) - user529758
@H2CO3,我不知道需要多少个问号才能向人们展示提问和“教导”之间的区别。我的问题很明显是在询问,而你非常感谢地回答了我的问题。你的故事寓意很好,但请在成熟度方面加以改进。感谢你的回答。 - Tommy Andersen

2
根据 https://dev59.com/vmkw5IYBdhLWcg3whK48#9833830!E 等同于 0==E,因此它的类型为 int

逻辑非运算符 ! 的结果是 0,如果其操作数的值不等于 0,则为 1,其结果的类型为 int。表达式 !E 等同于 (0==E)。

在您的16位体系结构上,sizeof(int) 是2,这解释了为什么在您的计算机上 sizeof(!a) 输出 2

-1

这可能会有所帮助。

void main(){
    int x = !4.3;
    printf("%d",x);//This will print 0
    printf("%d",sizeof(0));//This will print 2
    printf("%d",sizeof(!4.3));//Will print 2
}

你会发现 !4.3 会返回 0。 因此,sizeof(!4.3) = sizeof(0) = 2(因为0是整数),所以sizeof(!4.3)将为2。

1
我不明白你的推理。数值与大小有什么关系? - Theodoros Chatzigiannakis
5
sizeof 在编译时被评估。在 uint8_t x = 0 后面加上 sizeof(x) 将使 sizeof 评估为 1,因此您的示例没有多大意义。sizeof 关注的是类型,而不是值。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接