为什么位运算符需要括号

why bitwise operators require parentheses?

本文关键字:运算符 为什么      更新时间:2023-10-16
#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

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

根据操作员优先级此表达式:

n&1==0

等效于:

n&(1==0)

这意味着始终使用false操作的1==0操作结果与二进制和n一起使用。布尔 false被隐式转换为int,这是必需的按二进制操作和值为0。当二进制和0始终为0时,代码是令人费解的方法:

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

和0作为false转换回布尔值,因此您始终获得"数字是奇数"输出。因此,是的,在这种情况下,需要支架。

我的问题是,每当我们使用位运算符时,我们都必须放括号吗?

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

我的问题是,每当我们使用位运算符时,我们都必须放托架吗?否则我们在程序中遇到了逻辑错误。

如果您查看C 操作员优先表,您会注意到相等运算符(==)的优先级比位运算符更高。

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

回答与位运算符和平等运算符时是否需要使用括号的具体问题。

回答与位运算符和所有其他操作员交易时是否需要使用括号的一般问题,您需要将操作员优先表用作指南。

作为一般实践,我建议使用括号使代码更可读,并且意图更加清晰。当您并不总是确定所涉及的操作员的优先顺序时,它也有效。

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

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

正如埃奇姆(Edchum)在他的评论中提到的那样:平等运营商的优先级高于皮特。e。将首先评估平等性,就像首先评估乘法是因为在此术语中更高的优先级:

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

(我个人对此感到不满意,总是希望比特操作员具有更高的优先级 - 但标准是,我们必须与...")