为什么在s为1和-1的时候,算法是不一样的?#include #define s x=y=z#define P3(x,y,z) printf("x=%d\t y=%d\t z=%d\n",x,y,z)void main(void){ int x,y,z; s=1;++x||++y||++z;P3(x,y,z); s=1;++x&&++y||++z;P3(x,y,z); s=1;++x&&++y&&++z;P3(x,y,z); s=-1;++x||++y&&++z;P3(x,y,z); s=-1;++x||++y||++z;P3(x,y,z); s=-1;++x&&++y&&++z;P3(x,y,z);}。
算法是没问题的。
逻辑运算符的顺序从左到右。C里一旦能确定结果了就不继续往右判断了。
s=1;
++x||++y||++z;
因为是两个和运算符,当出现“真”时可以中途停止,表达式值为真(1)。
先是看++x的值,值是2,非0,则后面的判别式不用做就可知这个式子的值为1
这时x=2,y=1,z=1
s=1;
++x&&++y||++z;
先是看++x的值,值是2,非0,但后面是“与”,就要看++y。
++y的值是2,非0,则++x&&++y的值是真,后面是“和”,不用判断就可以知道整个表达式的值是1
这时x=2,y=2,z=1
s=1;
++x&&++y&&++z;
因为是两个与运算符,当出现“假”时可以中途停止,表达式值为假(0)。
++x、++y、++z依次计算都是非0,没出现中途停止的条件。
这时x=2,y=2,z=2
s=-1;
++x||++y&&++z;
++x的值是0,后面是“和”的话,要看||后面的值。
++y也是0,那++x||++y的值为假,后面跟着的是“与”,不用接着判断也知道整个式子的值是假。
这时x=0,y=0,z=-1
s=-1;
++x||++y||++z;
同第一个,遇到“真”(非0)可停止。
但三个式子都是0,则整个表达式的值为0。
这时x,y,z都为0
s=-1;
++x&&++y&&++z;
同第三个,只要一个是0就可停止。++x是0,后面的都不用做了。
这时x=0,y=-1,z=-1。