令人上头的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函数的主要内容,如果未能解决你的问题,请参考以下文章

C语言调用函数

C语言,为啥用 printf("%d",c*0.85)出来的结果不对?

c语言中printf的用法

C语言可变参数函数详解示例

C++test对多变参数的函数打桩处理技巧

printf,sprintf,vsprintf 区别