if (eXPRession1 && expression2) ... 對于編譯器來說,等同于下面代碼之一:
if (expression1.operator&&(expression2)) ... // when operator&& is a // member function if (operator&&(expression1, expression2)) ... // when operator&& is a // global function 這似乎沒有什么不同,但是函數(shù)調(diào)用法與簡短求值法是絕對不同的。首先當(dāng)函數(shù)被調(diào)用時(shí),需要運(yùn)算其所有參數(shù),所以調(diào)用函數(shù)functions operator&& 和 operator時(shí),兩個(gè)參數(shù)都需要計(jì)算,換言之,沒有采用簡短計(jì)算法。第二是C++語言規(guī)范沒有定義函數(shù)參數(shù)的計(jì)算順序,所以沒有辦法知道表達(dá)式1與表達(dá)式2哪一個(gè)先計(jì)算。完全與具有從左參數(shù)到右參數(shù)計(jì)算順序的簡短計(jì)算法相反。
逗號(hào)操作符用于組成表達(dá)式,你經(jīng)常在for循環(huán)的更新部分(update part)里遇見它。例如下面來源于Kernighan's and Ritchie's 經(jīng)典書籍The C Programming Language 第二版(Prentice-Hall, 1988)的函數(shù):
// reverse string s in place
void reverse(char s[]) { for (int i = 0, j = strlen(s)-1;i < j;++i, --j) // 啊! 逗號(hào)操作符! { int c = s[i]; s[i] = s[j]; s[j] = c; } } 在for循環(huán)的最后一個(gè)部分里,i被增加同時(shí)j被減少。在這里使用逗號(hào)很方便,因?yàn)樵谧詈笠粋€(gè)部分里只能使用一個(gè)表達(dá)式,分開表達(dá)式來改變i和j的值是不合法的。