通常我们在百度中搜索这个问题,都会出现一大堆答案。
内容主要是说 x++是先表达,再自加,++x是先自加再表达。
这样说是毫无问题的,但是最近我无意间碰到一个小问题。
#includeint main(){ int x=0; printf("%d %d %d",x++,x++,x++); return 0; }
上述这串代码,运行的结果是
我很困惑,为什么是2在前,0在后。
按照先表达再自加的理论的不应该是 0 1 2 吗?
于是我深入研究了一阵。
首先我将这段语句拓展成了如下代码。
#includevoid print(int n); //用递归的方法以逐次运行c++,展示在单个语句里运行x++的结果. int main(){ int x=0; printf("%dn",x++); printf("%d %dn",x++,x++); printf("%d %d %dn",x++,x++,x++); printf("%d %d %d %dn",x++,x++,x++,x++); print(x); return 0; } void print(int n){ static int x=0; printf("%dn",x++); if(x 运行结果如图
也就是说,当在一个语句中只使用一次x++时,并不会出现递增倒置的现象。
而我们知道编译器编译程序时是从左往右编译的。那么单行语句内多次使用x++导致递增倒置的现象是否是和这个特点有关呢。
我们来浅析一下。
设一条没有x++的正常语句的编译顺序为 p(x1,x2,x3....xn) 其中xi 表示可能出现的变量或者表达。
那么带有一个x++的语句为 p(x1,x2, x3...xk++...xn);
按照理论我们将带x++的语句中的++化简, 得到这样一个语句:p((x1,x2,x3..xk...xn)xk = xk+1)
那么带两个x++,就可以写成p(((x1,x2,x3..xk...xn)xk=xk+1)xk=xk+1)
如果此时我们这样思考,那么离真相就已经不远了。
由上,我们可以推出带多个x++的语句可以写成 p((((...x1,x2,x3,xk...xn)xk=xk+1)xk=xk+1.....)
于是,我们了解到,语句是从内向外的顺序表达,但是xk的自增是从外向内的,也就是说,当我们运行一个带多个x++的语句,出来的第一个x是最后一次的自增的结果,而最后一个x是第一次自增的结果!!!!
由此,我们得出了真相,x++运算是高于所有低于计算优先级的,甚至是被排除在语句表达的过程外!!



