【问题标题】:How many type conversion are there in the code?代码中有多少种类型转换?
【发布时间】:2016-11-13 19:31:57
【问题描述】:

以下代码中有多少种类型转换:

#include<stdio.h>
int f(int x)
{
    return (float)x;
}
int main()
{
    float x = f(5L);
    return 0;
}

在函数f() 中,返回值从int 提升为float。 在main() 中,f() 的参数从int 提升为longint 再次提升为float

有三种类型转换(促销)是否正确?

【问题讨论】:

  • 由于未使用x,优化编译可能会丢弃float x = f(5L);,并完成零转换。除此之外,我看到了 4 种以上的类型变化。
  • 所有转化都不是“促销”。
  • int 转换为float 以从int 函数返回值是什么?
  • 看起来像:long -> int -> float -> int -> float。这可以编译吗?
  • 这是作业题吗?

标签: c type-conversion type-promotion


【解决方案1】:

这个问题没有单一的正确答案——这完全取决于编译器和使用的系统。

一个好的编译器会通过除return 0;之外的所有内容,并且根本不会有任何转换。

即使编译器仍然保留函数,转换的次数仍然无法预测。 5Lint 的转换将在编译时解决。所以它不应该算作转换。同样在许多系统上,longint 之间没有区别,因为它们都是 32 位(在许多系统上),这再次表明这不是转换。

在大多数系统上,导致int-&gt;float-&gt;int 的丑陋(float) 转换必须保留为float 不能代表int 的所有值。但是如果系统使用可以表示所有int 值的浮点格式,编译器可能会通过转换离开。 main 中的 int-&gt;float 必须保留。

所以我会说 0、1 或 3 次转换。使用优化进行编译时最有可能出现 0。

但真正的答案是 - 它依赖于系统和编译器。

【讨论】:

    【解决方案2】:

    f:

    int(参数)-> float(转换)-> int(返回值)

    main:

    long(字面量)-> int(参数)

    int(f的返回值)->float(变量x)

    这是四次转化。

    【讨论】:

      【解决方案3】:

      我看到总共 4 次类型转换(都不是“促销”)。

      f() 内部,x 的值通过强制转换运算符从int 显式转换为float,该转换的结果通过@987654328 从float 隐式转换为int @ 声明。

      main() 内部,常量5L 的值在作为参数传递给f 时隐式从long int 转换为int。调用f 的结果通过x 的初始化从int 隐式转换为float

      这是四次转换。 (return 0; 不涉及转换,因为0 已经是int 类型,这是main 的返回类型。)

      考虑到一个相当聪明的编译器,很可能这些转换都不会产生任何非平凡的生成代码。由于没有使用任何值,整个程序可以简化为相当于

      int main(void) { return 0; }
      

      但所有四种转换都发生在 C 语义定义的“抽象机器”中。

      (顺便说一句,int main(void)int main() 更受欢迎。)

      【讨论】:

      • long int 到 int 的转换是降级吗?
      • @display_error:如果你想这样称呼它,当然可以,但我不会。 C 标准不使用这个词。它确实明确定义了术语“integer Promotions”(参见N15706.3.1.1);问题的代码中没有。
      • @display_error:更正:C 标准确实使用“降级”一词来指代 J.2 中的浮点转换——但它是非规范文本中该术语的非正式使用.
      • 为什么从int到float的转换不是提升(不是整数提升,但为什么不是提升)?
      • @display_error:仅仅是因为标准没有将其称为“促销”。我想,如果你愿意,你可以这样称呼它——但int 的值可能无法在float 类型中精确表示,并且肯定是float 类型之外的值int 的范围,那么为什么要将一个方向或另一个方向的转换称为“促销”?
      猜你喜欢
      • 1970-01-01
      • 2021-07-20
      • 2023-02-22
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多