关于c语言printf函数与自加问题

关于c语言printf函数与自加问题_第1张图片

        今天学弟问我挺有意思的一道题。  

        答案是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最后的值作为结果输出。

你可能感兴趣的:(c语言,c++)