c - 为什么一个复杂的位移命令不像一些具有相同逻辑的命令?
问题描述
例如,对于这些类似的代码,当我像第一个模式一样编写它时,条件为真,而在第二个模式中,条件为假。
我已经在调试器工具中实时观察了mask & (bits >> i)
和的值,尽管它们相同,但条件返回 false。mask
为什么会发生这种奇怪的行为?
1:
void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
unsigned int mask = 0x1;
unsigned temp;
temp = mask & (bits >> i);
if (temp == mask) //the same condition in other way
printf("true");
}
2:
void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
unsigned int mask = 0x1;
if (mask & (bits >> i)== mask) //the same condition in other way
printf("true");`
}
解决方案
等号运算符的==
优先级高于按位与运算符的优先级&
。
在第一种情况下,临时变量temp
得到更正的值,连续比较给出正确的结果。
在第二个示例中,比较发生在之前,比较结果与mask
.
因为比较只给出 1 或 0 分别表示真或假,如果(bits >> i)
设置 0 位,结果将始终为真(带mask==0x1
),否则为假。
工作代码必须使用括号来更改评估顺序,如下所示:
void printLetters(unsigned int bits, unsigned int i) // 0<i<7
{
unsigned int mask = 0x1;
if ( (mask & (bits >> i)) == mask) //note brackets
printf("true");`
}
推荐阅读
- slack - 如何为每个 Slack 频道设置不同的下载文件夹?
- reactjs - React JS 中的 LESS 预处理器集成
- java - 无法使用 java-saml-toolkit 登录到应用程序
- postgresql - CTE RECURSIVE 优化,怎么做?
- android - Android,Xamarin:更改目标框架后:“句柄必须有效,参数名称:实例”
- css - 从计算机上传图像文件并在 Wordpress 中设置为 div 背景图像
- python - 向悖论数据库文件添加新字段
- h2o - H2O XGBoost 错误和操作系统限制
- calendar - 颤动中的日历周视图
- sql - Oracle 12c - 在 SQL-LOADER 会话运行期间长时间运行的其他数据库会话