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

why bitwise operators require parentheses?

#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

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

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

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

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

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

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

根据operator precedence这个表达式:

n&1==0

相当于:

n&(1==0)

表示运算结果 1==0 总是 false 与二进制 AND 和 n 一起使用。布尔值 false 隐式转换为 int,这是必需的 通过二进制运算,值为 0。由于二进制与 0 的 AND 始终为 0,因此代码是令人费解的说法:

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

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

my question is do we have to put bracket whenever we are using bitwise operators?

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

my question is do we have to put bracket whenever we are using bitwise operators? or else we got logical error in our program.

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

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

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

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

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