3

在编写代码时,很长一段时间我知道& &比||有更高的优先级;然而,使用C++ 11标准编译它给了我一个警告,我现在应该在单个语句中使用它们时使用括号。C++ 11何时发出有关运算符优先级的警告?

现在我得到了一个警告,指出>>和+也应该有括号。现在我的言论看起来非常难看,五个或更多的括号在他们周围浮动。

1)是否有资源说明哪些操作符组合现在需要括号?

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

编译gcc与标志-O2 -Wall -g

的警告来的时候,我加入了标志-std=c++11

样品表达:

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

该标准没有说明必须发布任何警告(尽管它可能会建议这样做)。它们由编译器发出,作为对你的帮助,因此禁用它们是编译器特定的 – tambre

+0

哪个编译器?您应该将其添加到标签。 – HolyBlackCat

+0

发布有问题的表达式。一个警告很少发生,没有原因。 – DeiDei

回答

1

gcc manual

-Wparentheses

警告,如果括号在某些情况下,比如当有在上下文中的任务分配时,真值的预期,省略 或者运算符嵌套的优先级的人经常 混淆。

还警告如果比较出现x < = y < = z;这相当于(x < = y?1:0)< = z,这是与普通数学符号的 不同的解释。

还对GNU扩展的危险用途发出警告?:省略了中间操作数。当?:运算符中的条件为 布尔表达式时,省略的值始终为1.程序员 预期它是在条件表达式 内计算的值。

(我加的重点)

要关闭该行为,指定-Wno-parenthesesgcc/g++

+0

谢谢 - 这覆盖了“-std = C++ 11”选项,这正是我的目标。 – Alex

+1

@Alex:不,它不会覆盖'-std = C++ 11'。它只会导致编译器发出一些额外的警告,这是标准允许的。 (这个标准需要对某些事情进行诊断,但是对于编译器要警告的任何东西都允许有额外的警告,我知道C就是这样定义的;我非常肯定C++也是如此。) –

3

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

标准需要诊断消息(注意标准不区分停止编译的警告和错误)的唯一情况是程序违反标准时。除非编译器的表述优于“无需诊断”。

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


1)有没有说哪家运营商的组合,现在需要括号中的资源?

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

的警告来的时候,我加入了标志-std = C++ 11

对于它的价值,我的海湾合作委员会警告说,无论是标准的说法。


2)有没有办法沉默只是运算符优先级的警告,但保留其他的警告?

本身告诉它警告选项启用它的警告(这里是从我的GCC的警告):

警告:建议围绕 '+' 括号内的 '< <' [-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参数的类型。我不知道你使用的是什么类型。

+0

我得到'operator“<<”has优先级低于“+​​”; “+”将首先评估为 [-Wshift-op-括号];我不认为这个人可以像'[-Wparentheses]'是警告的一部分一样容易地知道如何禁用。 – Alex

+0

@Alex确实无法使用Wno-shift-op-括号吗? – user2079303

+0

哇,它的确如此。从来不知道,谢谢!太糟糕了,我已经接受了dlasalle的回答... – Alex