这个程序的输出是什么?
#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.为什么?
答案 0 :(得分:7)
此int i=x<y<z;
无法按预期方式运行。
效果为int i=(x<y)<z;
,首先评估x<y
,然后将值true
与z
进行比较。
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。