#include
void main(){
int a,b,c,d;
a=b=c=1;
d=++a||++b&&++c; //a=2;由于这是一个或表达式,而且++a为真,所以不再编译后面的内容,就是b,c都不自加,所以b,c还是原值。同时由于表达式真值为1,d=1
printf("d=%d,a=%d,b=%d,c=%d\n",d,a,b,c);
}
这是由于求值短路
参见以下页面
http://baike.baidu.com/view/1083418.html
!a||--b&&--b||!c-3
等价于
(!a)||(--b&&--b)||(!c-3)
怎么会等价于
(!a)||((--b)&&((--b)||(!c-3)))
啊,谁说的
对,楼主说基本的对,对于&&来说,两边都要判断的,如果左边的为假,直接执行,不会判断右边的;
对于||来说,只要左边的为真就直接执行了,不会判断右边的
厉害
短路求值
作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。这是这两个操作符的一个重要属性。假如expr1和expr2都是表达式,并且expr1的值为0,在下面这个逻辑表达式的求值过程中:
expr1 && expr2
expr2将不会进行求值,因为整个逻辑表达式的值已经可以确定为0。 类似地,如果expr1的值不是0,那么在下面的这个逻辑表达式的求值过程中:
expr1 || expr2
expr2将不会进行求值,因为整个逻辑表达式的值已经确定为1。
下面是一个简单的可能会出现短路求值的例子。假如我们需要处理的字符数量不超过5个。
int cnt =0;
while (++cnt<=5&&(c=getchar())!=EOF)
{
...
当表达式++cnt<=5的值是假时,下一个字符就不会被读取。