对于C语言的a++,++a, a--,--a的个人理解

可以直接跳到最后看结论!!!

先来道题:

写出下列程序的运行结果:

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

上机计算下正不正确???

大概就是这样子了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值