2014-09-19 111 views
-2
#include<stdio.h> 
main() 
{ 
int big,x=3,y=2,z=1,q=4; 
big=(x>y ? (x<z ? 20:10 && y>x ? 50:10) : (y>z ? 40:10 || x<q ? 30:10)); 
printf("big =%d",big); 
return 0; 
} 

& &是一个关系运算符,所以它应该返回一个真或假的值,即0或1,但在这种情况下它不是。请解释其输出背后的逻辑是什么?输出:关系和三元运算符?

Output: big =10 
+1

请更新问题以向我们展示输出结果。 – 2014-09-19 18:29:10

+0

谁写这样的代码? – 2014-09-19 19:40:59

+0

这是从一个门户网站,其中一个必须预测下面的代码片段的输出..因为我无法弄清楚我发布在这里! – 2014-09-24 19:38:27

回答

1

让我们把你的表达更明确一点,加入parethesis显示的优先级:

((x>y) ? 
    ((x<z) ? 
    20 : ((10 && (y>x)) ? 50 : 10) 
    ) : (
    (y>z)?40:((10 || (x<q))?30:10) 
    ) 
) 

xy更大,所以让我们考虑

((x<z) ? 
    20 : ((10 && (y>x)) ? 50 : 10) 
) 

x不小于z,所以

((10 && (y>x)) ? 50 : 10) 

y不大于x越大,所以

10 

你可以看到,结果是不实际的逻辑运算符。由于涉及的复杂性,您几乎可以肯定地使用if语句来表达这样一种评估,以清晰的方式分解逻辑。

1

这一切都是关于运算符优先级(以及令人不安的括号)。

当我运行你的程序时,我得到的输出是nbig =10(没有换行;你应该添加一个\n到你的格式字符串中)。

分配给big的值不是&&||运算符的结果。让我们一次一步地减少过度复杂的表达式。 (我在每一步的结果是不变的证实。)

big=(x>y?(x<z?20:10 && y>x?50:10) : (y>z?40:10 || x<q?30:10)); 

我们知道,x>y是真实的,所以我们可以删除测试和相应的?:运营商的第三个操作数:

big=(x<z?20:10 && y>x?50:10); 

让我们去掉无关外括号,增加一些新的围绕外?:运营商的第三个操作数,并改变间距有点:

big = x<z ? 20 : (10 && y>x?50:10); 

我们知道,x<z是假的,所以我们可以丢弃和操作外?:的:

big = (10 && y>x?50:10); 

显然10是真实的,那么:

big = (y > x ? 50 : 10); 

而且y > x是假的,所以结果是10 - 这是我运行程序时得到的结果。

你可能认为这样的:

a ? b : c && d ? e : f 

等同于:

(a ? b : c) && (d ? e : f) 

但实际上它是等价的:比更紧密

a ? b : ((c && d) ? e : f) 

因为&&运营商绑定运营商?:

在任何情况下,如果这是真实代码,您应该添加足够的括号,以便合理的知识渊博的读者可以理解代码,而不必咨询运算符优先级表。混合&&||?:可能会特别混淆。将表达式分解为子表达式,并将每个表达式分配给一个临时变量(因此它有一个有意义的名称)也可能有所帮助。

以上情况适用于您尝试复杂表情。如果你想了解别人写过的东西,你几乎必须自己解析它。试着做我所做的事:通过不改变含义的方式逐步简化表达式(通过删除部分或添加括号),在每一步中确认您获得相同的结果。如果是生产代码(而不是测验,看起来好像是这样),请考虑 怨恨 鼓励作者写出更清晰的代码。