令人上头的C语言——printf函数
Posted 安之ccy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了令人上头的C语言——printf函数相关的知识,希望对你有一定的参考价值。
今(昨)天小伙伴们在讨论一个题,我点开一看,居然是C语言的自增运算符!学C语言那会,最怕的就是指针和自增了😂看到这题,杠精之魂瞬间燃烧了起来,这题我一定要算对!不就是自增嘛,++i是先加后用,i++是先用后加,我会我会!刷地一下点进去看具体的代码
代码如下:
#include <stdio.h>
int main(){
int i = 8;
printf("%d\\n%d\\n%d\\n%d\\n%d\\n%d\\n", ++i, i++, --i, i--, -i++, -i--);
return 0;
}
输出的结果为:
8 8 7 8 -9 -8
问:为什么输出的第一个结果是8?
啊这。。。一下给我整不会了。咳咳😐
马上有大佬提出,printf从左往右获取参数,然后压入栈中,计算的时候再一个个从栈内取出来,所以,应该是从右往左计算的
听了大佬的建议,噢我觉得很靠谱啊。马上我又开始算,但是怎么算都有一个数字对不上
过程如下:
从右往左,我们一个个计算,是这样的:
-i--
:输出-8,计算之后i=7;-i++
:输出-7,计算之后i=8;i--
:输出8,计算之后i=7;--i
:i=6,输出6;i++
:输出6,计算之后i=7;++i
:i=8,输出8
奇怪,是哪里算错了吗,于是我找了在线编辑器来测试
问题出在了--i
的计算上,于是我只计算到--i
,不再往前计算,看看结果:
少了++i, i++
,--i
与全部整体计算时的输出不同了,说明--i
的输出是受整体影响的,一定还有规律没有发现
后来我找到了这篇文章,原来,在多参数输出时,前缀自增自减虽然改变了 i 值,但不会马上输出,要等全部参数都计算完成之后,才会输出(此时输出的是 i ,相当于计算时拿走了自增自减运算符,输出时只留下了 i )。于是,过程就变成了这样:
-i--
:输出-8,计算之后i=7;-i++
:输出-7,计算之后i=8;i--
:输出8,计算之后i=7;--i
:i=6,未输出;i++
:输出6,计算之后i=7;++i
:i=8- 参数都计算完成了,最终 i 为8。前缀自增、自减的地方开始输出,因此结果为:8 6 8 8 -7 -8
大佬也肯定了这个结论,“前缀不会马上输出”,一针见血
OK,★,°:.☆( ̄▽ ̄)/$:.°★ 。这题解决了,记录一下,以后要是又不会了,就翻出来看看。但是欠下了反汇编代码的知识点😂,知识的海洋无穷无尽,日后慢慢更吧~有一点收获就很开心啦
另:由于是C语言考题,应该是放在纯C语言环境考虑,使用的编译器参考如visual C++这样的编译器,如果放在其他编译器,结果就可能不同,比如Java下是这样的:
以上是关于令人上头的C语言——printf函数的主要内容,如果未能解决你的问题,请参考以下文章