阿里c/c++一面面试题

因为之前刷牛客时没有看到过这样的题,故将这道题分享给大家


输出结果应该是?说明为什么


#阿里巴巴##笔试题目#
全部评论
去学习了一下,来献个丑: 两个要点: 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。
点赞 回复 分享
发布于 2019-05-09 11:44
花里胡哨的....
点赞 回复 分享
发布于 2019-05-09 11:10
https://blog.csdn.net/u014644714/article/details/77688321 这是比较详细的解答
点赞 回复 分享
发布于 2019-05-09 11:31
这种未定义行为的题根本就没有客观确定性。你只需知道这题涉及知识点的是:printf函数参数入栈顺序大部分是自右向左,mac是自左向右。以及及自增运算的返回值是前置左值后置右值即可。然后具体的输出情况视编译器而定,因为表达式的参数是统一求值完毕**栈,还是单个运算后即时入栈,这是未知的。还有对于后置自增来说,如果同时出现多个变参操作,是表达式运算过程中变参,还是语句结束后统一变参这也是未知的。
点赞 回复 分享
发布于 2019-05-12 20:14
所以为什么
点赞 回复 分享
发布于 2019-05-09 11:16
在线求解答
点赞 回复 分享
发布于 2019-05-09 11:20
这个问题你只能说在C99以上的标准下进行运行,或者特指linux编译器下,就算++本身在本题中不会出现歧义,但是函数进栈的顺序是不同的,在C98中就是从左往右的,不要将一个题扣下来断章取义,我刚才就是这个问题拿出来瞬间被打脸,不同编译器跑的结果五花八门,所以记住我这个惨痛的教训,一定要注明环境问题
点赞 回复 分享
发布于 2020-04-15 21:22

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
4 20 评论
分享
牛客网
牛客企业服务