为什么按位运算符需要括号?

时间:2017-03-15 16:23:37

标签: c++ bitwise-operators evaluation

#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;
        }

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

每当我们使用按位运算符时,我们是否必须使用括号?

4 个答案:

答案 0 :(得分:2)

根据operator precedence这个表达式:

n&1==0

相当于:

n&(1==0)

表示始终为1==0的操作结果false与二进制AND一起使用n。布尔false隐式转换为int,这是必需的 通过二进制运算,值为0.因为二进制AND与0始终为0,所以代码是错综复杂的说法:

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

和0转换回布尔值为false,因此您总是得到“Number is odd”输出。所以是的,在这种情况下需要括号。

  

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

不,当涉及其他具有更高优先级的操作时,您必须使用它们。它不一定总是,但如果你愿意,你总是可以把它们放在一起。

答案 1 :(得分:2)

  

我的问题是,当我们使用按位运算符时,我们是否必须放置括号?或者我们的程序中存在逻辑错误。

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

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

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

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

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

答案 2 :(得分:1)

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

关于可读性等问题当然存在争议,但任何C ++开发人员都应该知道它的作用。

答案 3 :(得分:0)

正如EdChum在他的评论中提到的:等式运算符的优先级高于按位运算符,i。即首先评估相等性,就像首先评估乘法一样,因为这个术语的优先级更高:

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

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