【问题标题】:Why does sizeof(!5.6) give an output 2?为什么 sizeof(!5.6) 给出输出 2?
【发布时间】:2013-06-30 10:00:49
【问题描述】:

即使我们声明float a=5.6,那么printf("%d",sizeof(!a)) 也会输出2。 为什么输出整数的大小?

【问题讨论】:

  • ! 在这种情况下做了什么?
  • @Alex 你怎么确定的?
  • @Alex : 我使用的是 16 位环境。
  • 看到人们断言sizeof(int) 不可能是 2,这很可怕。
  • 我知道,我希望 OP 找出问题所在。

标签: c sizeof


【解决方案1】:

! 运算符返回一个整数类型,可能是intsizeof(int) == 2 显然是在你的架构上。

【讨论】:

  • 那不是真的,因为这是一道 C 题。在 C 中,!返回一个整数。
  • 哎呀,错过了这是 C,而不是 C++。编辑了我的答案以反映。
  • @Dibya C 自 1999 年以来一直拥有bool
  • @Casey:这是一种库类型,而不是基本类型。基本的布尔类型是 _Bool。
  • @H2CO3 仅在特定标头中。因此是“图书馆类型”。如果您忘记包含标头,编译器会呕吐。
【解决方案2】:

! 运算符不返回操作数的类型。如果您对float 执行NOT,您将不会得到float 回复。你会得到一个int,它的值与初始float的逻辑相反。

【讨论】:

  • 你确定,这是怎么回事?你不认为它首先对整数执行隐式转换吗?
  • @TommyA 首先,没有“隐式演员表”之类的东西,它是矛盾的。根据定义,演员表是明确的。显式类型转换 = 类型转换,隐式类型转换 = 类型提升或类型强制。其次,不,没有隐式转换。浮点数 0.1 被认为是真的,因为它不为零,尽管如果事先将其转换为整数类型(截断),它为零。 (道德:如果你不知道,不要教别人 C(和东西)。)
  • @H2CO3 我不知道需要多少问号才能向人们展示提出问题和“教”某人之间的区别。我的显然是在问一个问题,你,谢谢你,回答了。你故事的寓意很好,但请改进它的成熟部分。不过感谢您的回答。
【解决方案3】:

根据https://stackoverflow.com/a/9833830/1787973!E 等价于0==E,因此它的类型为int

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

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

【讨论】:

    【解决方案4】:

    这会有所帮助。

    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。

    【讨论】:

    • 我没有听从你的推理。值与大小有什么关系?
    • sizeof 在编译时进行评估。让uint8_t x = 0 后跟sizeof(x) 将使sizeof 评估为1,因此您的示例没有多大意义。 sizeof 是关于类型,而不是值。
    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多