&&與||的短路運算

在談&&和||兩個運算子的短路運算之前,先看一段程式:

#include <stdio.h>
int main() 
{
int para1 = 1, para2 = 2, para3 = 3, para4 = 4;
int r1 = 1, r2 =1;
(r1 = para2 < para1) && (r2 = para3 > para4);
printf("r1 = %d, r2 = %d\n", r1, r2);
r1 = 1;
r2 = 1;
(r1 = para2 > para1) || (r2 = para4 < para3);
printf("r1 = %d, r2 = %d\n", r1, r2);
return 0;
}

上面程式執行後,r1和r2分別是多少?

有不少同學認為第一個printf函式應該會輸出: 
r1 = 0, r2 = 0
因為para2 < para1為假,所以r1為0,para3
> para4也為假,所以r2也為0.

第二個printf函式應該會輸出:
r1 = 1, r2 = 0
因為 para2 > para1為真,所以r1為1,para4
< para3為假,所以r2為0.

實際執行結果如下:

實際執行結果與大家想的不一樣,原因在於&&和||運算子有一個“短路”的概念。
先來看:(r1 = para2 < para1) && (r2 = para3 > para4);
para2 < para1為假,所以r1為0,這個很好理解。此時&&左邊就是0,那麼不管&&右邊是0還是1,也就是不管&&右邊是假還是真,整個&&表示式就已經是假了,程式再去執行&&右邊的表示式就沒有意義了,所以程式不會去執行 (r2
= para3 > para4),也就是r2的值還是為1。當然,如果&&左邊是1的話,那麼程式還會繼續執執行(r2 = para3 > para4)的,此時r2的值就為0了;

再來看: (r1 = para2 > para1) || (r2 = para4 < para3);
 para2 > para1為真,所以r1為1,這個很好理解。此時||左邊就是1,那麼不管||右邊是0還是1,也就是不管||右邊是假還是真,整個||表示式就已經是真了,程式再去執行||右邊的表示式就沒有意義了,所以程式不會去執行 (r2
= para4 < para3),也就是r2的值還是為1;當然,如果||左邊是0的話,那麼程式還會繼續執執行(r2 =
para4 < para3)的,此時r2的值就為0了;