什么时候C ++ 11会给出关于运算符优先级的警告?

时间:2017-05-31 16:49:02

标签: c++11 gcc parentheses operator-precedence suppress-warnings

编写代码时,很长一段时间我都知道&&优先级高于||;但是,使用C ++ 11标准编译它给了我一个警告,我现在应该在单个语句中使用括号时使用括号。

现在我收到一个警告,即组合>> +也应该有括号。现在我的陈述看起来很丑陋,周围有5个或更多的括号。

1)是否有资源说明哪些运营商组合现在需要括号?

2)有没有办法让操作员优先警告静音,但保留其他警告?

编译器gcc,标记为-O2 -Wall -g

当我添加标记-std=c++11

时,警告就出现了

示例表达式:

(((string[0] << CHAR_BIT) + string[1] << CHAR_BIT) + string[2] << CHAR_BIT) + string[3];

2 个答案:

答案 0 :(得分:3)

  

C ++ 11何时会发出有关运算符优先级的警告?

标准需要诊断消息的唯一情况(请注意,标准不区分警告和停止编译的错误)是程序违反标准的情况。除非编译器与“无需诊断”的措辞相同。

所有其他警告对于编译器是可选的,而不是标准所要求的。

  

1)是否有资源说明哪些运营商组合现在需要括号?

不,因为不需要括号。警告只是编译器的建议。该计划格式良好。

  

当我添加标志-std = c ++ 11

时出现警告

对于它的价值,无论标准论证如何,我的GCC都会发出警告。

  

2)有没有办法让操作员优先警告静音,但保留其他警告?

警告本身告诉哪个警告选项已启用它(这是我的GCC的警告):

  

警告:建议'&lt;&lt;'内的'+'周围的括号的 [ - Wparentheses]

要禁用,您可以使用相应的选项将其停用:-Wno-WHATEVER

  

现在我的陈述看起来很丑陋,周围有5个或更多的括号。

我建议改为提取重复结构,并重用标准算法:

std::accumulate(string, string + 4, 0, [](auto sum, auto value) {
    return (sum << CHAR_BIT) + value;
});

括号少得多:)请注意,在C ++ 11中(在C ++ 14之前),您不能使用auto作为lambda参数的类型。我不知道你使用的是什么类型。

答案 1 :(得分:1)

请参阅gcc manual

  

-Wparentheses

     

如果在某些上下文中省略了括号,则发出警告,例如在预期真值的上下文中存在赋值时,   或者当嵌套运算符时,人们经常会得到优先级   困惑。

     

如果出现x&lt; = y&lt; = z之类的比较,也会发出警告;这相当于(x <=y≤1:0)&lt; = z,这是与此不同的解释   普通的数学符号。

     

还警告GNU扩展的危险用途是?:省略了中间操作数。当?:运算符中的条件是a时   布尔表达式,省略的值总是1.经常是程序员   期望它是在条件表达式中计算的值   代替。

(我加上了重点)

要关闭此行为,请将-Wno-parentheses指定为gcc/g++