#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");
}
这里表达式((x == 2) ? f : i)
求值为i
,类型为short int .. short int = 2,而sizeof float为4 byts.output应为&#34; short int&#34 ;但我得到了输出&#34; float&#34;
答案 0 :(得分:6)
这里表达式((x == 2)?f:i)求值为i,类型为short int
这不是通常的算术转换在C中的工作方式。? :
的第二和第三个操作数首先转换为公共类型,并且该类型是结果的类型表达方式。而且,由于促销活动,该类型在任何情况下都不会小于int
。
这一点在C11 standard的 6.3.1算术操作数一节中有所描述,这在这里引用的时间有点太长了。
答案 1 :(得分:1)
sizeof
是编译时运算符,因此无法计算x==2
。它通过转换为公共类型来评估三元表达式的类型,在本例中为float
(三元表达式的第二个和第三个操作数必须属于同一类型) ,int
转换为float
。)