意外输出的C代码

时间:2011-06-03 11:14:22

标签: c++ c

这个程序的输出是什么?

#include<stdio.h>
#include<conio.h>
void main()
{
    clrscr();
    int x=20,y=30,z=10;
    int i=x<y<z;
    printf("%d",i);
    getch();
}

实际上是i=20<30<10,因此条件为false且i的值应为0,但i等于1.为什么?

9 个答案:

答案 0 :(得分:7)

int i=x<y<z;无法按预期方式运行。

效果为int i=(x<y)<z;,首先评估x<y,然后将值truez进行比较。


Pascal指出低于C中的比较结果为1而不是true。但是,在下一次比较中,C ++ true会隐式转换为1,因此结果是相同的。

答案 1 :(得分:5)

比较运算符不能那样工作。您的计划相当于:

i = (x < y) < z;

相当于:

i = (x < y);
i = i < z;

第一次操作后,i == 1。所以第二个操作相当于:

i = 1 < 10;

您需要将语句重写为:

i = (x < y) && (y < z);

答案 2 :(得分:1)

<运算符具有从左到右的关联性。因此,x<y<z(x<y)<z。第一个括号的结果是1,1,小于10,所以你得到1。

答案 3 :(得分:1)

这不是它的工作原理。用括号看最好:

int i = (x<y)<z;

现在,首先评估x<y。这是真的,20<30,而真是1整数。 1<z再次成为现实。

答案 4 :(得分:1)

它的优先顺序是从左到右。这就是为什么它就像

20 <30 =是的 1&lt; 10 TRUE

非常正确

答案 5 :(得分:0)

实际上<是左关联的,所以首先评估20 <30(通常给出1),然后1小于10.

答案 6 :(得分:0)

“1”的输出是正确的。评估为(20<30) < 10,即1 < 10,即1。

问题在于您将布尔值与整数值进行比较,在大多数情况下,整数值没有意义。

答案 7 :(得分:0)

操作员< associates从左到右。

因此x < y < z( x < y ) < z

相同

您的表达式评估为:

  ( x < y ) < z
= ( 20 < 30 ) < 10
= ( 1 ) < 10
= 1 

答案 8 :(得分:0)

&LT;从左到右进行评估,因此20 <30是真的,或者一个,小于10。