全部评论
去学习了一下,来献个丑: 两个要点: 1. printf的操作是从右到左计算表达式的值,将返回值(地址)存入相应的缓存区。表达式计算完毕后,将所有缓存区按计算顺序入栈,依次弹栈输出。 2. 对于返回值,前置++i返回的是i变量本身的地址,而后置i++返回的是临时缓存区的地址(我们知道i++是先返回i再+1) 问题本身: 1. printf("%d, %d\n", ++i, ++i); 两个++i依次计算后,由于printf缓存区里存的就是i本身的地址,因此输出的就是i的最终值3。 2. printf("%d, %d\n", ++i, i++); 先计算i++:开辟临时地址,存入加之前的值3,将该地址存入缓存区; 再计算++i:将i的地址存入缓存区,此时i是5。
花里胡哨的....
https://blog.csdn.net/u014644714/article/details/77688321 这是比较详细的解答
这种未定义行为的题根本就没有客观确定性。你只需知道这题涉及知识点的是:printf函数参数入栈顺序大部分是自右向左,mac是自左向右。以及及自增运算的返回值是前置左值后置右值即可。然后具体的输出情况视编译器而定,因为表达式的参数是统一求值完毕**栈,还是单个运算后即时入栈,这是未知的。还有对于后置自增来说,如果同时出现多个变参操作,是表达式运算过程中变参,还是语句结束后统一变参这也是未知的。
所以为什么
在线求解答
这个问题你只能说在C99以上的标准下进行运行,或者特指linux编译器下,就算++本身在本题中不会出现歧义,但是函数进栈的顺序是不同的,在C98中就是从左往右的,不要将一个题扣下来断章取义,我刚才就是这个问题拿出来瞬间被打脸,不同编译器跑的结果五花八门,所以记住我这个惨痛的教训,一定要注明环境问题
相关推荐
11-22 16:58
天津大学 数据采集 点赞 评论 收藏
分享
10-29 11:26
成都东软学院 Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享