为什么a = b = c = 1; --a && --b || --c; printf("a=%d\tb=%d\tc=%d\n", a, b, c); 输出:a=0 b=1 c=0

如题所述

第1个回答  2011-11-06
a = b = c = 1;只是赋值,a b c 都等于1.
--a && --b || --c;这条按顺序执行,
先是--a,这样a自减后位0;
然后遇到 && 这是 与 :分两步
1、判断--a是否为1,为1则先执行 --b后再求与;
2、判断--a是否为0,如果为0,则--a && --b直接为0,而不执行--b。
由上知--a && --b为0,a=0,b=1.
后遇上||,这与&&不同,都要先执行 || 前后的语句;因为0||1也会得1.
故最后c=0。
只要弄懂先后执行顺序就好办了。就是 && || 这两个符号的区别。
第2个回答  2011-11-06
&& 左边的表达式为假就不继续往右进行,因为后面的表达式无论真假,结果都为假
|| 左边的表达式为真就不继续往右进行,因为后面的表达式无论真假,结果都为真
第3个回答  2011-11-06
根据C90和C99的标准规定。
编译器的判定为:表达式中如果存在逻辑运算符,将会是以下的执行过程(以你问题中的表达式为例):
1,&&的情况下,判定&&左边的值是否为真(1),若为真,则继续判定;若为假则直接返回“假”这个结果;
2,||的情况下,需要对表达进行完全解释判定才能得到具体结果。
3,前++和后++。对于前++,在表达式的等号运算符之前就完成了运算结果;而对于后++,则本次运算会持续到等号运算符之后完成,也就是说从下一跳有效语句开始才会完成计算。比如:
a=1;
b=2;
--a&&b--; //此时,a的值已经为0,而b的值还是2

综上,你的代码得到了上述的结果。
输出:a=0 b=1 c=0本回答被提问者采纳
相似回答