c语言运算符优先级问题

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

1.运算符优先级列表

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

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

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

#include<stdio.h>
    int main(){
    int a=b,(int b=3);
	printf("a:%d",a);
return 0;
}

观察

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

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

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

举一个例子:

 a=b+c*d;

按照数学的说法,“*”的优先级高于“+”,因此先执行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++;

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

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值