2014-08-28 76 views
1

在下面的代码中,当我获取第一个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"); 
} 

回答

0

问题是sizeof((x==2)?f:i)返回其参数的静态类型的大小。它的论点是(x==2)?f:i,即使条件不成立,也是float。这是因为表达式类型不是在运行时设置的,而是在编译期间。

3

无论选择哪个操作数,operator?:的结果必须是相同的类型。在这种情况下,第一个?:结果i转换为float,所以尺寸与float的尺寸相同。

我们可以看到在§6.5.15/ 5确定所述类型的精确的方法:

如果两个第二和第三运算数具有算术类型,则结果类型,这将是 通过通常的测定算术转换,是否应用于这两个操作数, 是结果的类型。

跳过到常见算术转换,中的有关内容在§6.3.1.8/ 1:

否则,如果对应的真实类型有一个操作数的是浮子,其他 操作数转换,而不改变域的类型,以相应的实型为float的类型。

你有它。

3

sizeof不会执行它的操作数,而且是一个编译时操作符,这意味着无论如何您都不能在非常量值上进行分支。

sizeof((x == 2) ? f : i)(x == 2) ? f : i的结果类型的大小。如果条件运算符被执行,条件运算符会将short提升为float,因此整个sizeof表达式等效于sizeof(float)

+0

没有促销,只有UAC。 – chris 2014-08-28 12:41:32

+1

*您需要管理员权限才能执行此分支*。啊。 – Quentin 2014-08-28 12:46:45

+0

哈。我仍在努力在Windows之前将它与C++联系起来。 – chris 2014-08-28 12:47:27