自增自减运算的原理解析

int a=1;

int b=1;

a+++++b;

a---b;

经常有人问到以上的这些表达式的值是什么..?是根据什么原理来分析这样的表达式...?就这个内容,来讨论一下...

 

这里需要涉及到"贪心法"这个说法了...在<<c traps and pitfalls>>中说明了这样一个规则:每一个符号应该包含尽可能多的字符.

意思是:编译器在分析程序的时候,是从左至右的单个字符读入的,那么类似"/*test"这样的字符串,那要怎么解析呢..?根据规则,第一个读入的肯定是字符'/'了,那么要尽可能包含多的字符,尝试着去包含字符'*',结果他们能够组成有效字符串"/*",那么继续解析,下一个字符是't',和前面的字符串组合起来没有意义,因此"/*"是能够组合的有意义的最长的字符串了.因此,解析的结果出来了,"/*test"应该解析为"/*"再加上"test","test"继续按照上面的规则进行解析...这就是词法解析的过程,即为"贪心法".

 

那么原理上明白后..我们来看表达式a+++++b;应该如何解析:

同样根据规则来:

先解析出字符'a',下一个是字符'+',根据尽可能多的包含字符的原则,下面一个也是字符'+',组合在一起是"++",这在c语言中就是自增运算符了,因此完全是有效的运算符,所以这样就解析了"a++",依此类推,根据规则,接下来的也是会解析成"++"了,这里就有了一个问题了...

应该都知道,在c语言中,a++是不能作为左值使用的,因此根据规则来是解析成"++",整体应该是"(a++)++",但是因为限制了a++不能作为左值,违反了c语言的语法,所以不能这样解析,那么就只能解析成'+'了,那么现在就解析成了"(a++)+(++b)"...

所以结果也就自己出来了...不再赘述.

 

你可能感兴趣的:(c,语言,编译器)