为什么位运算符需要括号
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;
}
输出:偶数//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 & 1
比1 == 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!
(我个人对此感到不满意,总是希望比特操作员具有更高的优先级 - 但标准是,我们必须与...")
- 为什么比较运算符如此快速
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 为什么模数运算符不适用于该代码
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 为什么在运算符重载时需要参考?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 为什么文本运算符不能正常模板化?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 为什么我收到错误:"运算符<<不匹配?
- 为什么初始化时没有调用重载赋值运算符?
- 为什么此对箭头 (->) 运算符的调用失败?
- 为什么 C++ 11 在 ios 类中添加了运算符 bool
- 三元运算符为什么以及何时返回左值?
- 超载运算符C :为什么分母乘以10
- 成员函数中的Const运算符(为什么可以分为两个不同的部分)
- 位运算符:为什么~35=-36