禁止使用逗号运算符

时间:2011-11-15 16:49:17

标签: c++ 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
}

是否可能出现编译错误而不是错误的,难以调试的代码?

2 个答案:

答案 0 :(得分:21)

是的,请注意。 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警告。

作为参考,Mike Seymours的手册的完整-Wunused-value条目突出显示:

  

当语句计算明确未使用的结果时发出警告。要禁止此警告,请将未使用的表达式转换为void。 这包括表达式语句或逗号表达式的左侧,不包含副作用。例如,x [i,j]等表达式会引发警告,而x [ (无效)我,j]不会。

答案 1 :(得分:2)

gcc允许您指定 -Wunused-value ,如果逗号运算符的LHS没有副作用,它将发出警告。