【问题标题】:can some please explain how float is the output of this program有人可以解释一下这个程序的输出是怎样的吗
【发布时间】:2021-07-22 10:48:21
【问题描述】:

请解释一下这个程序的输出是怎么浮动的 看不懂

#include <stdio.h>
int main()
{
    int x = 1;
    short int i = 2;
    float f = 3;
    if (sizeof((x == 2) ? f : i) == sizeof(float))
        printf("float\n");
    else if (sizeof((x == 2) ? f : i) == sizeof(short int))
        printf("short int\n");
}

【问题讨论】:

    标签: c integer operators conditional-operator ternary


    【解决方案1】:

    确实,三元运算符并没有完全按照您的想法返回,但也不是 @user15790236 的想法。三元运算符 is 是一个运算符,因此它期望冒号两侧的参数类型相同。由于您有不同的类型,因此整数被提升为浮点数,因此表达式的类型为浮点数。

    【讨论】:

    • 详细信息:“整数被提升为浮点数”-->“short 被提升为 float”(或更准确地说,“short 被提升为 int,然后到float")
    • 我建议您还添加 ANSI C,float 是 IEEE 754 单精度二进制,所以 32 位 并且 int 类型大小依赖于实现(ANSI C 只要求它至少应为 16 位,无论如何大多数实际的常见实现都将其设置为 32 位)。
    • @Zilog80 有什么要备份的 ANSI Cfloat 指定为 IEEE 754 单精度二进制声明?
    • @chux-ReinstateMonica 也许我错了。在我看来,ISO/IEC TR 24732:2009 已包含在 C11 中?
    • 整数被转换float。 C 标准使用单词“promotion”来表示整数提升和默认参数提升。这些是保留值的特定类型转换——它们只转换为更包容的类型,可以表示原始类型的所有值,因此是“提升”。相反,从整数类型到浮点类型的转换可能会更改值,具体取决于类型的详细信息。这种转换并不总是对包含类型的提升。
    【解决方案2】:

    三元运算符的返回值与您想象的不完全一样。

    ( (x == 2) ? f : i ) 实际上返回 i 的 value,它是按值计算的,然后被处理为 int,而不是短 int - 因此,根据您的 64 位编译器,大小为 4 个字节。换句话说,三元运算符的返回是 i 中的内容的副本,而不是 i 本身。

    通过检查以下值向自己证明这一点:

    sizeof(2)
    

    要得到你所期望的,你可以说:

    ( (x==2) ? sizeof(f) : sizeof(i) )
    

    您可能要考虑的下一个问题是,为什么编译器选择 int 作为类型,而 short 可以解决问题。看看Implicit type promotion rules

    【讨论】:

    • 试试double f = 3; if (sizeof((x == 2) ? f : i) == sizeof(double ))。这将导致“然后被处理为双精度,而不是短整数”
    【解决方案3】:

    从 C11 开始,要注意 类型,宁可尝试 sizeof(type) 比较,请使用 _Generic

    #include <stdio.h>
    
    #define type(X) _Generic((X), \
        short: "short", \
        int: "int", \
        float: "float", \
        double: "double", \
        default: "default" \
    )
    
    int main(void) {
      int x = 1;
      short int i = 2;
      float f = 3;
      puts(type(x));
      puts(type(i));
      puts(type(f));
      puts(type((x == 2) ? f : i));
    }
    

    输出

    int
    short
    float
    float
    

    (x == 2) ? f : ifloat,正如@SGeorgiades 指出的那样,a?b:c 的类型是相同的,无论a 是否为真。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多