簡體   English   中英

禁止使用逗號運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM