C/CPP运算优先级的坑及解决

 更新时间:2023年08月04日 16:06:34   作者:_不会dp不改名_  
这篇文章主要介绍了C/CPP运算优先级的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C/CPP运算优先级坑

1. 位运算优先级低于比较运算符

做leetcode时遇到的,判断一个数某一比特位是否为0。

if ( val & 2 == 0) {
	// do someting...
}

万万没想到&运算符的优先级是低于==的,debug了好久,得加上括号。

1.1 验证

#include <iostream>
int main( int argc, char *argv[]){
    int val = 2;
    if ( val & 1 == 0) {
        std::cout << "without (): bit 1 is 0" << std::endl;
    }
    else {
        std::cout << "without (): bit 1 is 1" << std::endl;
    }
    if ( (val & 1) == 0) {
        std::cout << "with (): bit 1 is 0" << std::endl;
    }
    else {
        std::cout << "with (): bit 1 is 0" << std::endl;
    }
    return 0;
}

输出结果为

without (): bit 1 is 1
with (): bit 1 is 0

2. 移位运算符优先级低于算术运算符

这是在写二分的时候遇到的, l + (r-l) >> 1 的值永远为r >> 1

应该写作l + (r - l >> 2)

2.1 验证

#include <iostream>
int main( int argc, char *argv[]){
    int l = 2, r = 8;
    int mid = l + (r - l) >> 1;
    int mid2 = l + ( r - l >> 1);
    std::cout << "mid: " << mid << std::endl;
    std::cout << "mid2: " << mid2 << std::endl;
    return 0;
}

输出结果为

mid: 4
mid2: 5

C语言运算优先级口诀

C语言常用运算符的优先级口诀是:“单算关逻条赋逗”;

如果加入位运算符,完整口诀是:“单算移关与,异或逻条赋”。

  • “单”表示单目运算符:逻辑非(!),按位取反(~),自增(++),自减(--),取地址(&),取值(*);
  • “算”表示算术运算符:乘、除和求余(*,/,%)级别高于加减(+,-);
  • “移”表示按位左移(<<)和位右移(>>);
  • “关”表示关系运算符:大小关系(>,>=,<,<=)级别高于相等不相等关系(==,!=);
  • “与”表示按位与(&);
  • “异”表示按位异或(^);
  • “或”表示按位或(|);
  • “逻”表示逻辑运算符:逻辑与(&&)级别高于逻辑或(||);
  • “条”表示条件运算符(? :);
  • “赋”表示赋值运算符(=,+=,-=,*=,/=,%=,>>=,<<=,&=,^=, |=,!=);

另,逗号运算符(,) 级别最低,口诀中没有表述,需另加记忆..

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C/C++宏定义的可变参数详细解析

    C/C++宏定义的可变参数详细解析

    在1999年版本的ISO C 标准中,宏可以象函数一样,定义时可以带有可变参数。宏的语法和函数的语法类似
    2013-09-09
  • C++强制类型转换详细示例代码

    C++强制类型转换详细示例代码

    在C++中,强制类型转换(Type Casting)是将一种数据类型转换为另一种数据类型的操作,这篇文章主要介绍了C++强制类型转换的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • C语言中改变目录的相关操作函数详解

    C语言中改变目录的相关操作函数详解

    这篇文章主要介绍了C语言中改变目录的相关操作函数详解,分别是fchdir()函数和rewinddir()函数的使用方法,需要的朋友可以参考下
    2015-09-09
  • C++多线程强制终止详细

    C++多线程强制终止详细

    这篇文章主要介绍了C++多线程强制终止, 实际上,没有任何语言或操作系统可以为你提供异步突然终止线程的便利,且不会警告你不要使用它们。但是下面我们再来简单看看相关内容吧
    2021-09-09
  • 用代码和UML图化解设计模式之桥接模式的深入分析

    用代码和UML图化解设计模式之桥接模式的深入分析

    本篇文章是对桥接模式进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C/C++中使用局部/全局变量初始值或默认值问题

    C/C++中使用局部/全局变量初始值或默认值问题

    这篇文章主要介绍了C/C++中使用局部/全局变量初始值或默认值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • C++指向类成员的指针详解

    C++指向类成员的指针详解

    指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),希望本片文章能给你带来帮助
    2021-09-09
  • C语言的动态内存管理的深入了解

    C语言的动态内存管理的深入了解

    这篇文章主要为大家详细介绍了语言C的动态内存管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言中.与->的区别详细解析

    C语言中.与->的区别详细解析

    这篇文章主要给大家介绍了关于C语言中.与->区别的相关资料,这虽然是个小问题,但有时候很容易让人迷惑,因为有的时候用混淆了,程序编译不通过,需要的朋友可以参考下
    2023-06-06
  • C语言实现简单职工信息管理系统

    C语言实现简单职工信息管理系统

    这篇文章主要为大家详细介绍了C语言实现简单职工信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论