编写代码时,很长一段时间我都知道&&优先级高于||;但是,使用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];
答案 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++
。