1、vc-表达式编译过程:自增自减连用的问题,复杂表达式求解与表达式计算器(很多 c /c+教材或者考试中都出现过自增自减连用的复杂表达式,很多时候这种表达式的结果往往和我们锁预料的大相径庭。所以我花了一些时间去了解了 vc 平台下的表达式编译过程,成功求出了我所遇到的任何表达式的值,从此不怕此类问题的刁难。)vc 对表达式的求解过程是递归的,求解过程如下:一、它按照优先级表,从低到高地查找表达式中的运算符。二、每找到一个运算符(比如+号),则按照结合方向和目数(单目,双目,三目)将表达式分为几个部分并准备计算(因为+是双目运算符,所以以+为分界分开左右两个部分,接下来必须先求出左右两个值之后才能
2、求+),如果没有,转四。三、计算时如果一个运算符的操作数又是一个表达式,则转向第一步,按从低到高顺序查找运算符,这样直到所有操作数都求解完毕后计算运算符的值,也就是在此递归。如果运算符的操作数都已得到具体值,那就求出这个运算符的结果。四、然后查找更高优先级的运算符,转二。注:vc 在第一次查找时就把有先使用再自增(自减)地方直接去掉自增(自减)符号了,也就是说比如 a+,a-这样的符号出现在表达式中时,直接当成 a 进行计算,直到整个表达式的值都求出后,再计算自增自减。例 1:int a=5,b;b=+a*+a*+a;首先找到有最低优先级的*号,两个*把表达式分成 3 个部分,其中第一部分与第
3、二部分就是第一个*的操作数(因为*的结合性自左向右),现在需要将这两个操作数都计算完才能计算*的值,所以+a 又+a 得到 a=7,现在 a*a=49 了。对于第二个*,因为左边的操作数已知,所以求右边的操作数:+a 得到 a=8所以 49*a=392。例 2:int a=5 b;b=a+*a+*a+;因为 a+要先使用再自增,所以先剔除+。也就是 b=a*a*a 得 125,然后算a+,a+,a+得 a=8。例 3:b=a+*-a+a-*+a;剔除后置的+-后得到等价表达式:b=a*-a+a*+a; a+; a-;于是第一次运算以+为分界表达式被分成(a*-a)与(a*+a)两段(a*-a)中以*为分界把表达式分成 a 与-a 两段左侧已知 a=5,右侧-a 得到 a=4于是上式变为 a*a=16。这里很多人仍然不明白为什么不是 5*4=20 而是 4*4。原因是要计算*就必须知道*两边的具体值,当两边的值都求出时,a 已经变为 4 了,而左边曾经的 5 并没有被 vc 寄存,所以左边的 a 同样是 4。同理(a*+a)中以*为分界把表达式分成 a 与+a 两段左侧已知 a=4,右侧+a 得到 a=5于是上式变为 a*a=16现在 16+25=41利用类似的原理我们就可以编写表达式计算器了,也就是按照一定语法输入表达式进行计算的计算器,根本思想是递归地求解每一个运算符。