编译原理之算符优先分析的两个有趣小栗子
今天上编译原理课时,老师讲了些非常有意思的知识,总结一下,也分享给大家~
先抛出一个小栗子
大家思考一下,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:配图均来自网络,侵删~