可以直接跳到最后看结论!!!
先来道题:
写出下列程序的运行结果:
int a = 0;
printf(“%d %d %d %d”, ++a,a,a++,a);
结果:2 2 0 2
为什么不是???
1 1 1 2
因为大部分printf是由右往左计算的,入栈由从低位压到高位
比如上面的题目,解析如下:
先从右往左,压栈进去
低位>-->高位
这是一个个入栈的演示
a
a++ a
a a++ a
++a a a++ a
开始由高位计算(入栈时就计算了,这是演示)
0
1(0) 0
1 1(0) 0
2 1 1(0) 0
括号里的数值是++a和a++的区别(--a和a--也一样),
先称之为影子,没有的称为真值。
我的理解:++a是没有影子的,只有a++有。
输出时,是影子输出的,没有影子的输出全部输出最低位的真值。
所以结果输出:
2 2 0 2
结论:
影子和真值其实计算a++或a--时的保留值,影子代表的是先调用a时的值,
真值是不管你是a++后++a,都直接运算加1给你
比如:int a=1; a++ 影子是先调用a的值,数据为1
真值是直接计算了,数据为2
这就是先调用再计算(a++),先计算再调用(++a)的区别了
简单来说,就是相当于左边是低位,右边是高位
计算从右边的高位开始,计算完后,输出影子,
没有影子,全部输出最低位的真值(就是最左边的真值)
最低位有影子也无所谓,它的真值照样是全部没有影子的输出值。
来道题练习一下
int a=1;
printf("%d %d %d %d %d %d %d\n", a--, ++a, --a, a++, ++a, a++, ++a);
最左边就是最低位,就是那个a--
先入栈,并计算,算了,直接算吧,题目给出a=1,从右直接算过来
到时候直接输出(最低位真值是4)
4(5) 5 4 5(4) 4 3 (2) 2
计算结果:
5 4 4 4 4 2 4
上机计算下正不正确???
大概就是这样子了。