为了账号安全,请及时绑定邮箱和手机立即绑定

if语句中的sizeof()运算符

if语句中的sizeof()运算符

C
慕森卡 2019-09-03 15:52:15
#include <stdio.h>int main(void){    if (sizeof(int) > -1)        printf("True");    else        printf("False");}它打印False。为什么sizeof()不返回值if?
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

  1. sizeof它不是一个功能,它是一个操作员。括号不是运算符名称的一部分。

  2. 它失败了,因为生成的值具有无符号类型size_t,这导致“通常的算术转换” -1转换为无符号,在这种情况下,它是一个非常大的数字。

基本上你正在比较4 > 0xffffffffu,或者至少接近它。有关详情,请参阅此问题。


查看完整回答
反对 回复 2019-09-03
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

  • if语句中>运算符的操作数是sizeof(int)-1

  • sizeof(int)是类型size_t,保证是无符号整数。在实践中,size_t很可能至少与unsigned int那里的任何系统一样大。

  • -1是类型int,相当于signed int

  • 不会发生整数提升,因为两个操作数都是足够大的整数类型。

  • 然后根据正式称为通常算术转换的C规则平衡两个操作数。

这些状态(C11 6.3.1.8):

...

否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型。

否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。

  • 上面的后者将会发生,因为(签名)int不能适合a的所有值size_t

  • 因此-1转换为无符号整数。实际上,size_t很可能等同于unsigned int或unsigned long。在这样的变量中存储-1时发生的是实现定义的行为。

  • 在二进制补码计算机上(世界上所有计算机的99.9%),-1将被解释为0xFFFFFFFF(FF的数量取决于给定系统上int的大小)。

  • 4 > 0xFFFFFFFF 评估为假。


查看完整回答
反对 回复 2019-09-03
  • 3 回答
  • 0 关注
  • 578 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信