int i=0;
int n=0;
1 && n++ || i++;
printf("i:%d\n", i);
printf("n:%d\n", n);
0 && n++ || i++;
printf("i:%d\n", i);
printf("n:%d\n", n);
int n=0;
1 && n++ || i++;
printf("i:%d\n", i);
printf("n:%d\n", n);
0 && n++ || i++;
printf("i:%d\n", i);
printf("n:%d\n", n);
return 0;
在网上看到这样一段代码。运行结果如下
输出:
i:1
n:1
i:2
n:1
经过仔细思量,终于理解,现将其记录下来以备将来翻阅
&& 和 ||都是左侧法则,从左侧向右侧执行。而且&&的优先级比||高,因此运行逻辑如下:
第一个逻辑表达式“1 && n++ || i++;”中,先判断 1&&n++,因为1为真,所以需要判断n++,因为n的初值是0,所以这个判断的结果是0,(执行之后,n的值也变成了1),接下来表达式变成了“0||i++”,因为左侧是0,所以要判断右侧,因此就会执行i++,而i初值是0,所以次表达式的结果为0,(执行之后,i的值也变成了1),因此就有了前两个输出。
第二个逻辑表达式“0 && n++ || i++;”,先判断“0&&n++”,因为有0存在,所以此表达式不再运行n++,直接判定结果为0,因此n依然是1。接下来判断后半段,此时的表达式已经变成“0||i++”,因为前面是0,所以会执行i++,因为i在第一个表达式中已经变成1了,所以这里是就会是2。因此就有了后两个的输出。