意外输出的C代码

lea*_*ers 3 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Bo *_*son 7

int i=x<y<z;不符合您的预期.

效果是int i=(x<y)<z;,x<y首先评估,然后将值true与之进行比较z.


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


Oli*_*rth 5

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

i = (x < y) < z;
Run Code Online (Sandbox Code Playgroud)

这相当于:

i = (x < y);
i = i < z;
Run Code Online (Sandbox Code Playgroud)

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

i = 1 < 10;
Run Code Online (Sandbox Code Playgroud)

您需要将语句重写为:

i = (x < y) && (y < z);
Run Code Online (Sandbox Code Playgroud)