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

相关推荐

09-16 14:01
井冈山大学 Java
肖先生~:兄弟们,我发的她都点赞了,但是就是不给我微信
秋招被确诊为……
点赞 评论 收藏
分享
珩珺:那些经历都太大太空了,实习的情况不了解,大创项目连名字、背景、目的及意义都没体现出来;地摊经济更是看完连卖的什么产品都不知道,项目成果直接写营收多少都更直观真实一点;后面那个校文体部的更是工作内容是组织活动整理流程,成果变成了当志愿者,而且你们学校本科学生会大一入学就直接当部长吗,志愿里面还提到了疫情防控,全面解封是22年12月的事情,可能时间上也有冲突。可能你花了钱人家就用AI给你随便写了点内容改了一下,没什么体现个性化的点
点赞 评论 收藏
分享
评论
4
20
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务