【问题标题】:why bitwise operators require parentheses?为什么按位运算符需要括号?
【发布时间】:2017-03-15 16:23:36
【问题描述】:
#include<iostream>
using namespace std;
int main()
    {

    int n;
    cin>>n;
    if(n&1==0)   //without using bracket  (n&1)
        cout<<"Number is even";
    else
        cout<<"Number is odd";
    return 0;
    }

输出:奇数 //对于 n=6

#include<iostream>
    using namespace std;
    int main()
        {
        int n;
        cin>>n;
        if((n&1)==0)
            cout<<"Number is even";
        else
            cout<<"Number is odd";
        return 0;
        }

输出:偶数 //for n=6

在使用位运算符时是否必须使用括号?

【问题讨论】:

  • operator precedence,相等运算符的优先级高于位运算符,因此需要括号
  • 是的,我的错。
  • @EdChum 我会使用更强的“需要括号”,即。运营商的任何混合。那样更容​​易
  • 这就是为什么你应该有你的警告。我的 GCC 说 warning: suggest parentheses around comparison in operand of '&amp;' [-Wparentheses] 关于第一个 sn-p。
  • 在对操作顺序问题有任何疑问时包含括号将帮助您的代码读者理解您打算实现的行为 - 没有它们,他们将不得不怀疑他们是否正在查看一个微妙的操作顺序错误,或者不是。

标签: c++ bitwise-operators evaluation


【解决方案1】:

根据operator precedence这个表达式:

n&1==0

相当于:

n&(1==0)

表示运算结果1==0 始终为falsen 的二进制AND 一起使用。布尔值false 隐式转换为int,这是必需的 通过二进制运算,值为 0。由于二进制与 0 始终为 0,因此代码很复杂:

if(0) 
    cout<<"Number is even";
else
    cout<<"Number is odd";

和 0 转换回布尔值作为 false 所以你总是得到“数字是奇数”输出。所以是的,在这种情况下需要括号。

我的问题是,当我们使用按位运算符时,我们是否必须加上括号?

不,当涉及到其他优先级更高的操作时,您必须使用它们。它不必总是,但如果你愿意,你可以随时放置它们。

【讨论】:

  • 但是,&amp; 的优先级仍然高于&amp;&amp;。所以像n&amp;&amp;1==0 这样的东西相当于n&amp;&amp;(1==0),但不是:/
  • @polfosolఠ_ఠ 是的,它是等价的
【解决方案2】:

我的问题是,当我们使用按位运算符时,我们是否必须放置括号?否则我们的程序会出现逻辑错误。

如果您查看C++ operator precedence table,您会注意到相等运算符 (==) 的优先级高于位运算符。

因此,n&amp;1==0 被解释为n &amp; ( 1 == 0 )。要确保n &amp; 1 的优先级高于1 == 0,您需要使用括号:(n &amp; 1) == 0。 (顺便说一句,您可以使用 n % 2 == 0 获得预期结果,但我仍然建议使用 (n % 2) == 0)。

这回答了在处理位运算符和相等运算符时是否需要使用括号的具体问题。

要回答在处理位运算符和所有其他运算符时是否需要使用括号的一般问题,您需要使用运算符优先级表作为指导。

作为一般做法,我建议使用括号使代码更易读,意图更清晰。当您不确定所涉及的运算符的优先顺序时,它也可以工作。

【讨论】:

    【解决方案3】:

    您实际上不需要在这里与 0 进行比较。 MSVC 可能会发出性能警告,但你可以说if (i%2) { odd; } else { even; }

    关于可读性等问题当然存在争议,但任何 C++ 开发人员都应该知道这是做什么的。

    【讨论】:

    • 表达式if (i&amp;1)可能更快,这取决于编译器的优化设置和编译器优化技术。如果编译器识别出i%2,它可能会将其转换为i&amp;1
    【解决方案4】:

    正如 EdChum 在他的评论中提到的那样:相等运算符的优先级高于按位与,即 i。 e.将首先评估相等性,就像首先评估乘法一样,因为该术语具有更高的优先级:

    if(1 + 3 * 0 == 0) // won't be true!
    

    (我个人对此并不满意,总是更喜欢具有更高优先级的位运算符 - 但标准是这样的,我们必须忍受......)

    【讨论】:

    • 老实说,这是我更喜欢 C# 在 bool 类型周围的行为的另一个原因。相等和关系运算符评估为bool,而bool 不能与算术或按位运算符一起使用,因此即使运算符优先级首先绑定相等运算符,当您尝试执行int &amp; bool 时也会出现编译时错误.
    猜你喜欢
    • 1970-01-01
    • 2014-08-09
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    相关资源
    最近更新 更多