[英]Disallow using comma operator
我從不使用逗號運算符。
但有時候,當我寫一些遞歸時,我犯了一個愚蠢的錯誤:我忘了函數名。 這就是返回最后一個操作數的原因,而不是遞歸調用的結果。
簡化示例:
int binpow(int a,int b){
if(!b)
return 1;
if(b&1)
return a*binpow(a,b-1);
return (a*a,b/2); // comma operator
}
是否有可能獲得編譯錯誤而不是錯誤的,難以調試的代碼?
是的,有一個警告。 gcc具有-Wunused-value
警告(或帶有-Werror
錯誤)。 這將對您的示例生效,因為a*a
無效。 編譯結果:
test.cpp: In function ‘int binpow(int, int)’:
test.cpp:6:43: warning: left operand of comma operator has no effect [-Wunused-value]
但是,這不會捕獲單參數調用和所有參數都有副作用的調用(如++
)。 例如,如果你的最后一行看起來像
return (a *= a, b/2);
警告不會被觸發,因為逗號語句的第一部分具有更改a
的效果。 雖然這對於編譯器是可診斷的(分配以后未使用的本地非易失性變量)並且可能會被優化掉,但是沒有針對它的gcc警告。
作為參考,本手冊的完整-Wunused-value
條目與Mike Seymours引用突出顯示:
只要語句計算明確未使用的結果,就會發出警告。 要禁止此警告,請將未使用的表達式轉換為void。 這包括表達式語句或逗號表達式的左側,不包含副作用。 例如,諸如x [i,j]之類的表達式將導致警告,而x [(void)i,j]則不會。
gcc允許您指定-Wunused-value ,如果逗號運算符的LHS沒有副作用,它將發出警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.