C++|“短路求值”與“貪心法則”

1 “短路求值”

邏輯與、邏輯或操作符在使用時,總是先計算它的左操作數,然後再計算右操作數。只有在靠左操作數的值無法確定該邏輯表達式的結果時,才會去求解右操作數。這種求值方式也被稱為“短路求值(short-circuit evaluation)”,&&和||的短路操作雖然會簡化計算過程,但也會帶來副作用:

int i=6;
int j=1;
if(i>0 || (j++)>0)
cout<

j++的計算會被忽略,對於||,如果一個為真,其他不需要考慮了,整個表達式是真,也就是C++編譯器應用了“短路求值”的原則,如果後面的值不影響整個表達式的值,後面沒必要再計算了。

當表達式中有||時,為避免編譯器略掉後面的計算,適合將可能性小的表達式放在左邊先計算,當然,最好的辦法是在||的右邊最好是不需要計算的表達式,以避免出錯。

再來看&&運算符:

if(i<0 && (j++)>0)
cout<

j++的計算會被忽略,對於&&,如果一個為假,其他不需要考慮了,整個表達式是假,也就是C++編譯器應用了“短路求值”的原則,如果後面的值不影響整個表達式的值,後面沒必要再計算了。

當表達式中有&&時,為避免編譯器略掉後面的計算,適合將可能性大的表達式放在左邊先計算,當然,最好的辦法是在&&的右邊最好是不需要計算的表達式,以避免出錯。

2 “貪心法則”

C語言有一個簡單的“貪心法則”:每一個符號應該包含儘可能多的字符。

也就是說,編譯器將源代碼,從左到右,一個字符一個字符地讀入,如果加入下一個字符依舊可以構成一個合法符號,則包含該字符,直到不可以為止。

如- 和 -- 都是合法運算符,但 --- 不是。

int a=8;
int b=3;
cout<<a---b>cout</<a---b>

分析:

首先,a是一個合法符號,a-不是,所以第1個符號是a;
其次,-是一個合法符號,--也是一個合法符號,但---不是,所以第2個符號是--;
然後,-是一個合法符號,-b不是一個合法符號,所以第2個符號是-;
最後,只剩下一個字符b,它是一個合法的符號;

所以,a---b,依據貪心法則,得出的結果是:a -- - b ,也就是 (a--) - b;

(備註:合法的符號,如變量名,只能有大小寫字母、數字和_下劃線組成,並且不能是數字開頭這裡的a和b都是變量名。)

-End-


分享到:


相關文章: