如果
i
是int
变量且f
是float
变量,那么条件表达式(i > 0 ? i : f)
的类型是什么?
考虑i
的任意值,因为我只想知道表达式的类型。我没有得到如何检查此表达式的类型,因为如果我们将结果存储在int
变量中,我们将输出作为整数,如果结果存储在float
变量中,输出为float
。
问题来自K. N. King书。
答案 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