C中此表达式的返回类型是什么?

时间:2018-06-18 17:53:10

标签: c

  

如果iint变量且ffloat变量,那么条件表达式(i > 0 ? i : f)的类型是什么?

考虑i的任意值,因为我只想知道表达式的类型。我没有得到如何检查此表达式的类型,因为如果我们将结果存储在int变量中,我们将输出作为整数,如果结果存储在float变量中,输出为float

问题来自K. N. King书。

3 个答案:

答案 0 :(得分:4)

6.5.15条件运算符中,第4段:

  

如果第二个和第三个操作数都有算术类型,那么通常算术转换确定的结果类型是应用于这两个操作数的结果类型,是结果的类型。

然后在 6.3.1.8常规算术转换,第1段:

  

否则,如果任一操作数的相应实数类型为float,则另一个操作数将在不更改类型域的情况下转换为对应实数类型为float的类型。

因此,表达式的类型为float

答案 1 :(得分:3)

受到Determining the type of an expression的启发:

void test()
{
    int i = 0;
    float f = 0.;

    int ***a = i > 0 ? i : f;
}
  

错误:使用不兼容类型的表达式初始化'int ***'   '浮动'

int ***a = i > 0 ? i : f;
       ^   ~~~~~~~~~~~~~

因此类型为float

建议的printf方法不可靠,因为varargs float被提升为double

至于推理,已有另一个答案,引用标准提及普通类型,所以我在此不再重复。

答案 2 :(得分:-3)

#include <stdio.h>

int main(void)
{
   int i=0;
   double f=1.0;
   printf("%d\n",i>0?i:f);
   return 0;
}

gcc版本6.3.0,使用-Wall

编译
warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' [-Wformat=]
  printf("%d\n",i>0?i:f);

所以(condition?int:float)的类型是float