• C/C++运算优先级


    前言

    最近复习C++基础知识的时候,发现对这部分还是有些模糊。常用的+ - × ÷
    ,括号等运算符对于它们的优先级还是比较明确的。但是涉及到移位运算,逻辑运算这种,再结合四则运算,就有点分不清了。
    为此这篇博客就记录一下,后面再稍微结合点例子举例说明一下。


    1.运算优先级表

    优先级运算符功能目数结合性
    1( )改变运算优先级或函数调用双目从左向右
    [ ]访问数组元素
    .直接访问数据成员
    ->间接访问数据成员
    2!逻辑非单目从右到左
    ~按位取反
    +,-取正,取负
    *间接访问对象
    &取对象地址
    ++,- -增1,减1
    ( )强制类型转换
    sizeof测类型长度
    3*,/,%乘除取余双目从左到右
    4+,-加减
    5<<,>>,>>>按位左移,按位右移,无符号右移
    6<,<=,>,>=小于,小于等于,大于,大于等于
    7==,!=等于,不等于
    8&按位与
    9^按位异或
    10|按位或
    11&&逻辑与
    12||逻辑或
    13?:条件运算符三目从右向左
    14=赋值双目从右向左
    +=,-=加赋值,减赋值
    *=,/=乘赋值,除赋值
    %=,&=取余赋值,按位与赋值
    ^=按位异或赋值
    |=按位或赋值
    <<=按位左移赋值
    >>=按位右移赋值
    15,逗号运算符双目从左向右

    2.举例说明:

    Example1

    求值:5+10*20/2

    这个就是简单的四则运算,先乘除再加减。
    对应一下上面的表就是,乘除的优先级3比加减的优先级4要高,所以先乘除,同时满足从左到右,因此先是乘,10乘以20,再是除,200除以2,最后在加5,得到的答案为105

    Example2

    求值:12 / 3 * 4 + 5 * 15 + 24 % 4 / 2

    这个和上面类似,只不过多了一个取余%,结合上表,优先级3,4两行。
    所要求的式子等价于((12 / 3) * 4) + (5 * 15) + ((24 % 4) / 2)=9

    Example3

    假设i、j和k是三个整数,说明表达式i!=j

    这题就是比较!=<之间优先级的比较。
    查一下表可以看到!=优先级为7,<为6,所以应该先算小于,再判断不等号。
    因此上式的求值过程等同于i !=(j

    Example4

    因为运算符的优先级问题,下面这条表达式无法通过编译。根据上表指出它的问题在哪里?应该如何修改?
    string s = “word” ;
    string pl = s + s[s.size ( ) - 1] == ‘s’? “” : “s” ;

    看这个第二句赋值语句,我们是想判断字符串s的最后一个字符是否是s,如果是的话就不变,否则就让s字符串的最后一个字符为s。
    但是这里因为运算符优先级问题,无法实现我们想要的效果。

    题目中的几个运算符的优先级次序从高到低是加法运算符、相等运算符、条件运算符和赋值运算符,因此式子的求值过程是先把s和 s [s.size ( ) - 1]相加得到一个新字符串,然后该字符串与字符’s’比较是否相等,这是一个非法操作,并且与程序的原意不符。
    要想实现程序的原意,即先判断字符串s 的最后一个字符是否是’s’,如果是,什么也不做;如果不是,在 s 的末尾添加一个字符’s’,我们应该添加括号强制限定运算符的执行顺序。
    string pl = s + (s [s.size() - 1] == 's'? "" : "s") ;

    Example5

    如果一台机器上int占32位.char占8位,用的是 Latin-1字符集,其中字符’q’的二进制形式是01110001,那么表达式~ ‘q’<<6的值是什么?

    在位运算符中,运算符~(优先级2)的优先级高于<<(优先级5),因此先对q按位求反,因为位运算符的运算对象应该是整数类型,所以字符’q’首先转换为整数类型。如题所示,char占8位而int占32位,所以字符’q’转换后得到
    00000000 0000000 00000000 01110001,按位求反得到11111111 11111111 11111111 10001110;接着执行移位操作,得到11111111 11111111 11100011 10000000。
    C++规定整数按照其补码形式存储,对上式求补,得到10000000 000000000011100 10000000,即最终结果的二进制形式,转换成十进制形式是-7296

    Example6

    说明下面这条表达式的含义。
    somevalue ?++x,++y : - -x,- -y

    这个咋一看,somevalue为真,那就++x,++y,否则就- -x,- -y。
    我们自己看一下上面的表,这里的条件运算符和逗号之间的优先级还是存在一些差异的。

    C++规定条件运算符的优先级高于逗号运算符,所以somevalue ? ++x,++y :- -x,- -y
    实际上等价于(somevalue ? ++x,++y : - -x),- -y。
    它的求值过程是,首先判断somevalue是否为真,如果为真,依次执行++x和++y,最后执行- -y;如果为假,执行- -x和- -y。


    总结

    这篇博客总结了一下运算优先级表,并举了一些简单和稍微复杂的例子作为辅助。后期在编程中遇到优先级问题,其实最好的方式我觉得是加括号。但是有时做题目,或者看别人的代码,理解时还需要脑子里有这个对照表。

  • 相关阅读:
    使用flex布局实现,7种经典布局案例
    米家竞品分析
    零基础如何自学网络安全,基于就业前景全方位讲解,包教包会
    Chapter 6 CNN(Convolutional Neural Network)
    猴子吃桃问题
    JavaScript中的运算符
    Java 中 Method 和 MethodSignature 区别
    Android检测其他应用是否安装
    MKRTOS MCU上的微内核操作系统
    Windows 安装PostgreSQL
  • 原文地址:https://blog.csdn.net/Edwinwzy/article/details/133927964