编译原理之算符优先分析的两个有趣小栗子

今天上编译原理课时,老师讲了些非常有意思的知识,总结一下,也分享给大家~

先抛出一个小栗子

编译原理之算符优先分析的两个有趣小栗子

大家思考一下,i + i - i * (i + i)这个运算表达式先算哪部分?

此处思考三分钟。。。。
编译原理之算符优先分析的两个有趣小栗子

我相信,大多数人和博主一样第一感觉先算括号 里面的,但是理智又告诉我,应该先算左边第一个加号更合适。但是,博主却不能清晰的说出原因。。,,ԾㅂԾ,,

那么我们先来分析,为什么第一感觉会是先算括号里面的呢?

众同学答道:“括号的优先级最高,所以先算括号里面的。”

看着好像。。没什么毛病。。

但是,博主很遗憾的宣布,第一个先运算的是左边的加号。。

为什么呢??(・∀・(・∀・(・∀・*)

事实是这样的:运算符优先级的比较只在相邻的op(运算符)之间进行比较,而总所周知,根据自左向右的结合性,我们再来看上面的小栗子i + i - i * (i + i)里面,首先比较+-的优先级,是同级运算符对不对,那么,我们显然是要从左到右进行运算~ 所以答案和理由就出来咯!o( ̄▽ ̄)ブ

我们再反过来思考一下,为什么我们的第一反应会是括号里面的呢?

某同学回答:“小学数学老师教的。。”

众人大笑~

其实,回想一下,我们小的时候,老师确实让我们先算括号里面的,然后再做乘除,最后做加减。。难道是老师错了?

事实是这样的,其实,那个时候,我们学的叫速算,我们总认为,先把括号里面的值算出来之后,整个表达式会变得简单一点,把乘除做完,整个表达式会变得更简单一点。。没毛病吧~

但是我们的计算器,计算机不是这样计算的,他们只认相邻op(运算符)的优先级别。

到这里,我们应该能够理解正确的运算顺序,以及我们错误的原因啦。。又解决了一个问题,o( ̄▽ ̄)ブ

抛出第二个小栗子

学程序设计基础的时候,我们接触过各种各样的表达式,比如:算数表达式,关系表达式,逻辑表达式等,再细分一下,又有,加法运算表达式,减法运算表达式,赋值运算表达式,逗号运算表达式等。。
栗子来啦~
a = 10 , 5 , 6 这个表达式叫什么名字?
a = (10 , 5 , 6)这个表达式交什么名字?

思考三分钟。。
编译原理之算符优先分析的两个有趣小栗子

又含有逗号,又含有赋值的表达式叫什么呢?
答案如下:
a = 10 , 5 , 6 这个表达式叫逗号运算表达式。
a = (10 , 5 , 6)这个表达式叫赋值运算表达式。

其实,一个表达式,他叫什么名字,是由最后一个运算符来命名的。。

所以,我们第一个小栗子i + i - i * (i + i)它叫什么名字呢?

某同学回答:“数学表达式。”

我发誓,在课堂那么严肃的地方,我没笑。。

这个表达式叫算术表达式肯定是没毛病的。。具体一点呢?

其实,它叫减法表达式。为什么呢??当然是因为减号最后算咯~

运算顺序:
1. a = i + i
2. b = (i +i)
3. c = i * b
4. d = b - c

PS:配图均来自网络,侵删~