条件运算符
问题描述:
在下面的代码中,当我获取第一个if
的条件的值时,它是0,因此是错误的。仍然,输出打印“浮动”。这是短路的结果吗?如果是这样,为什么在“正常”情况下不会发生这种情况,sizeof
运算符未与'=='一起使用?条件运算符
#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");
else if(sizeof((x == 2) ? f : i) == sizeof(short int))
printf("Short int");
}
答
问题是sizeof((x==2)?f:i)
返回其参数的静态类型的大小。它的论点是(x==2)?f:i
,即使条件不成立,也是float
。这是因为表达式类型不是在运行时设置的,而是在编译期间。
答
无论选择哪个操作数,operator?:
的结果必须是相同的类型。在这种情况下,第一个?:
结果i
转换为float
,所以尺寸与float
的尺寸相同。
我们可以看到在§6.5.15/ 5确定所述类型的精确的方法:
如果两个第二和第三运算数具有算术类型,则结果类型,这将是 通过通常的测定算术转换,是否应用于这两个操作数, 是结果的类型。
跳过到常见算术转换,中的有关内容在§6.3.1.8/ 1:
否则,如果对应的真实类型有一个操作数的是浮子,其他 操作数转换,而不改变域的类型,以相应的实型为float的类型。
你有它。
答
sizeof
不会执行它的操作数,而且是一个编译时操作符,这意味着无论如何您都不能在非常量值上进行分支。
sizeof((x == 2) ? f : i)
是(x == 2) ? f : i
的结果类型的大小。如果条件运算符被执行,条件运算符会将short
提升为float
,因此整个sizeof
表达式等效于sizeof(float)
。
没有促销,只有UAC。 – chris 2014-08-28 12:41:32
*您需要管理员权限才能执行此分支*。啊。 – Quentin 2014-08-28 12:46:45
哈。我仍在努力在Windows之前将它与C++联系起来。 – chris 2014-08-28 12:47:27