
今天学弟问我挺有意思的一道题。
答案是8,2,5
第一反应是a++和++a很好说但a++ + ++a是什么东西啊。
首先我们知道printf函数里面的运算是从右向左计算。也就是说。先执行++a运算再执行a++运算最后再执行a++ + ++a运算。
但是想了半天不知道为什么会是这样的运算结果。于是又去搜索一下是不是对printf函数的理解有什么不对的地方,于是有了新的发现。printf()在执行的时候,虽然是从右向左计算但是,计算并不等于输出。printf函数底层原理是一个栈。从右向左以此压入栈,并进行计算,计算结果仍在栈里保存,还未进行输出。++a与a的结果均是计算结束后a的值,而a++保存的是当前a的值,这也是为什么a++的值为2的原因。
那么原题执行时,a的值变化就可以根据上面论述来推算。
首先进行++a运算入栈当前a的值为2。再对a++运算进行入栈,先赋值后运算因此a的值也为2。再对a++ + ++a进行入栈。但是之前进行了自加运算,赋给a++ + ++a中的第一个a,也就是相当于原式变成3++ + ++a。然后连续进行了两次自加运算,第二个a的值变为5。此时计算结束。最先入栈的++a的a的值也变为了5。然后进行出栈输出。3+5 2 5。也就是8 2 5。
总结:
在printf()函数中,入栈顺序从右向左,且计算不等于输出。
在进行a++操作时,会记录此时a的值并作为结果输出。
在进行++a与a时,会不断随着计算修改a的值并把a最后的值作为结果输出。
博客围绕学弟提出的题目,探讨printf函数中a++ + ++a的运算结果。指出printf函数运算从右向左,但计算不等于输出,其底层是栈结构,从右向左压入栈并计算。还分析了a++、++a在运算中的值变化,总结了运算规则。
772

被折叠的 条评论
为什么被折叠?



