开发者

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

开发者 https://www.devze.com 2023-11-20 13:34 出处:网络 作者: _不会dp不改名_
目录C/CPP运算优先级坑1. 位运算优先级低于比较运算符2. 移位运算符优先级低于算术运算符C语言运算优先级口诀总结C/CPP运算优先级坑
目录
  • C/CPP运算优先级坑
    • 1. 位运算优先级低于比较运算符
    • 2. 移位运算符优先级低于算术运算符
  • C语言运算优先级口诀
    • 总结

      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"php << std::endl;
          }
          if ( (val & 1) == 0) {
              std::cout << "with (): bit 1 is 0" << std::endl;
          }
      js    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 = 8python;
          int mid = l + (r - l) >> 1;
          int mid2 = l + ( r - l >> 1);
          std::cout << "mid: " << mid << std::endl;
          std::cout javascript<< "mid2: " << mid2 << std::endl;
          return 0;
      }

      输出结果为

      mid: 4

      mid2: 5

      C语言运算优先级口诀

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

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

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

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

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号