• c语言运算符优先级问题


    文章概述:主要阐明复杂式子中c语言运算符的计算顺序,它不仅仅与优先级有关系,还与计算机执行指令的机制有关。

    1.运算符优先级列表

    1)如果是嘉庚的学生,请参考书本《c语言程序设计教程》郭一晶主编p43
    2)另外还可以参考C语言运算符优先级列表(超详细)

    2.程序中不同优先级的处理方式

    按照上文阐述,优先级高的式子具有优先计算的特点,那么,

    #include
        int main(){
        int a=b,(int b=3);
    	printf("a:%d",a);
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    观察

    int a=b,(int b=3);

    按照优先级划分,‘,’(逗号表达式)的优先级低于“()”(括号),因此 int b=3 应该先执行,a=b可以执行。
    这显然很荒谬,这样执行后报错:
    在这里插入图片描述
    错误显示b是第一次使用,显然程序的读取顺序仍然是从左到右,并不是单纯看运算符的优先级。

    所以,优先级到底是怎么发生作用的呢?

    举一个例子:

     a=b+c*d;
    
    • 1

    按照数学的说法,“*”的优先级高于“+”,因此先执行c*d,但在c语言程序里,程序仍然是从左到右读取的,因此实际优先级发挥的作用可以看作,如图:

    在这里插入图片描述
    分析:优先级高在程序里并不会优先执行,而是将运算符两边的变量结合的更紧密。程序依然是从左往右读取的,只是读取过程中,变量更紧密的一边会自成整体。

    所以上图的程序执行方式为(依然是丛左向右读取程序):
    1.读取a=
    2.由于=结合方向为自右向左,因此需要先读取右边的b
    3.读到b时,发现=无法将b结合过来,因为b右边的+优先级高于=,所以无法执行a=b,必须将b+右边看成整体,因此下一步读取这个整体。
    4.读取整体中的b+c时,发现+的优先级小于c右边的*号,因此+不得不把c*d看成整体后再参与运算。因此要先解决掉c*d
    5.至此程序读取完毕。内存把c*d当做整体和b相加,再把加起来的值赋值给a

    又如:

    int a=3,b=4,d=9;
    b=a>b||a++;
    
    • 1
    • 2

    第二行根据优先级应当看做:
    在这里插入图片描述
    从图中可以看出a++由于优先级最高,因此最紧密,对其他运算来说,它是个整体,除非有其他运算符比它优先级高,将它分开。但还不是优先级高就先执行,依然从左到右边。
    可以将其改成这样:

    b=( (a > b) || (a++))

    但是程序依然是从左往右读取。

  • 相关阅读:
    ArduPilot开源飞控之AP_Mission
    vue_mixin混入
    第19章 数据库备份与恢复【4.日志与备份篇】【MySQL高级】
    Apache httpd漏洞复现
    图片转excel表格怎么弄?有何密笈?
    畅购商城_第13章_微信扫码支付
    3. 基本数据类型
    C++ 并发编程实战 第九章
    android View和ViewGroup创建以及绘制流程
    LCR 006.两数之和 II - 输入有序数组
  • 原文地址:https://blog.csdn.net/weixin_43592833/article/details/127684917