一道关于C++的题目,我算了15,但是答案是16,不解啊,求解释

 我来答
marsding2006
2013-12-28 · TA获得超过4627个赞
知道大有可为答主
回答量:3090
采纳率:40%
帮助的人:1388万
展开全部
我能说答案错了吗?
a+= a; b+= b; // 带入3和4,a=6,b=8
c = f1(a+b, ++b); // a+b的值是14,++b取自加后值,是9
f1(14, 9)
{
c = b%2; 取余是1
return a+c; // 14+1,返回15
}
更多追问追答
追问
有一种说法是:在f1那括号了先算++b,然后再算a+b,这样就算到16了。你觉得对吗?
追答
啊,是我错了,好像和参数入栈有关系,原来关键点隐藏很深啊。这个涉及到__stdcall和__cdecl调用约定的问题,VC默认好像是__stdcall,参数传递从右到左,通过堆栈传递,故先执行了,++b,容我扯谎一下吧~
zjfaok
2013-12-28 · TA获得超过6808个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1765万
展开全部
我能说出题者是SB么?
f1(a+b, ++b)中a+b和++b的计算顺序是不确定的,编译器可以理解成(而且看起来确实理解成了)先计算++b,后计算a+b,因此f1的前一个参数值是15,后一个参数的值是9,所以输出是16
对于这种代码,clang和g++编译器都会报错,因为语句f1(a+b, ++b);的行为在标准中没有定义,这样的代码是不可移植的
追问
谢谢了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式