#include<stdio.h>
int main()
{
int i = 0;
printf("%d %d %d %d\n",--i,i--,++i,i++);
}
第一次接触到这个问题,相信大家跟我一样,信心满满,心里想着“这不就是考,先++就先+再调用,后++就先调用再+”,于是把这一题秒了。
--i,先减再调用,答案-1,i变为-1
i--,先调用再减,答案-1,i变为-2
++i,先加再调用,答案-1,i变为-1
i++,先调用再加,答案-1,i变为0
所以最终答案为:-1 -1 -1 -1
但实际上答案是:0 2 0 0
其实,printf输出时表达式值的计算顺序是从右到左,例如:
#include <stdio.h>
int main()
{
int a=5;
printf("%d %d %d",a,a+2,a=1);
return 0;
}
答案不是我最开始认知的5 7 1,而是1 3 1
正是因为printf输出时表达式值的计算顺序是从右到左,先计算a=1,改变了a的值,a+2和a并没有改变a的值,不用计算。最后打印的时候再从左往右,即1 3 1。
有了从右往左的思想后,我们引入栈这个内容,简单来讲就是一个死胡同,先进去的最后才能出来,最后进去的最先出来,在这里就是最后面的最先进入栈,最后打印。
我们回过头来看这题
#include<stdio.h>
int main()
{
int i = 0;
printf("%d %d %d %d\n",--i,i--,++i,i++);
}
1、从右向左计算
2、先计算后打印
3、++/--前置的打印真值
4、++/--后置的打印缓存值
5、此题,从后往前看,i++存储i的缓存值为0,i加1变为1
6、++i不改变缓存值,i真值加1变为2
7、i--存储i的缓存值为2,i真值减1变为1
8、--i不改变缓存值,i真值减1变为0
故最终答案为 0 2 0 0
画出我们理解的栈即为:
i=0 | 缓存值 | 真值 | 打印 | |
栈顶 | --i | 不改变 | 0 | 真值 |
i-- | 2 | 1 | 2 | |
++i | 不改变 | 2 | 真值 | |
栈底 | i++ | 0 | 1 | 0 |
真值=0
最终打印:真值 当前缓存值 真值 当前缓存值,即0 2 0 0
来个题目巩固一下
#include<stdio.h>
int main()
{
int i = 3;
printf("%d %d %d %d %d %d %d %d %d %d\n",--i,i--,++i,--i,i--,++i,--i,i--,++i,i++);
return 0;
}
我们直接上表格秒了他
i=3 | 缓存值 | 真值 | 打印 | |
栈顶 | --i | 不改变 | 1 | 真值 |
i-- | 3 | 2 | 3 | |
++i | 不改变 | 3 | 真值 | |
--i | 不改变 | 2 | 真值 | |
i-- | 4 | 3 | 4 | |
++i | 不改变 | 4 | 真值 | |
--i | 不改变 | 3 | 真值 | |
i-- | 5 | 4 | 5 | |
++i | 不改变 | 5 | 真值 | |
栈底 | i++ | 3 | 4 | 3 |
真值=1
答案 1 3 1 1 4 1 1 5 1 3
标签:真值,--,++,int,缓存,printf From: https://blog.csdn.net/m0_56934903/article/details/143331256