发个小题让大家做做,不许编译偷看哦

jruv 2006-03-23 12:39:04
void foo(int m, int n)
{
printf("m=%d, n=%d\n", m, n);
}

int main()
{
int b = 3;
foo(b+=3, ++b);
printf("b=%d", b);
}
输出结果是什么?
...全文
880 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
aya331 2006-03-26
  • 打赏
  • 举报
回复
===============================
这条问题跟编译器有关系!
我用TurboC2.0和VC6.0出来的结果都是:
m=7 , n=4
b=7
================================

这是出入栈的顺序问题。
aya331 2006-03-25
  • 打赏
  • 举报
回复
根据入栈的规则我认为是输出7 4。
localhero 2006-03-25
  • 打赏
  • 举报
回复
请高人解释一下!!!!
localhero 2006-03-25
  • 打赏
  • 举报
回复
请用 VC7.1 Debug和 Release 分别测试这同一份代码
release是什么????
jruv 2006-03-25
  • 打赏
  • 举报
回复
ox_thedarkness的解释比较合理,不过最好看看编译器生成的汇编码就清楚了,debug版本的好看,不知道VC里release版本的怎么看汇编码
aniude 2006-03-25
  • 打赏
  • 举报
回复
.NET 下

m=7,n=7
b=7
比较BT,呵呵
wi1son 2006-03-25
  • 打赏
  • 举报
回复
这条问题跟编译器有关系!
我用TurboC2.0和VC6.0出来的结果都是:
m=7 , n=4
b=7
zzw820626 2006-03-25
  • 打赏
  • 举报
回复
C++之父教育我们多少次了,函数参数的求值顺序是未定义的,怎么还有这样的事情发生?
foo(b+=3, ++b);
liumingqiang02 2006-03-25
  • 打赏
  • 举报
回复
ox_thedarkness()说得很清楚啊,还是不争论这个问题比较好!
rosegun38 2006-03-24
  • 打赏
  • 举报
回复
m=7,n=4
b=7
september___29 2006-03-24
  • 打赏
  • 举报
回复
最好还是写清晰一点的code
trisen 2006-03-24
  • 打赏
  • 举报
回复
m=7.n=4
b=7,++优先级
slayer530 2006-03-24
  • 打赏
  • 举报
回复
毫无意义....执着于语言是没有前途的.
ox_thedarkness 2006-03-24
  • 打赏
  • 举报
回复
to ugg()
我觉得未定义就是最好的解释,完全按照标准的说法,坚决不写与实现相关的代码是最好的对策。 标准这么说的意思就是:只要没有顺序点你怎么做方便就怎么做。 所以我坚决不同意你最开始的解释方法,那是一种误导。这个东西要解释,无异于事后诸葛亮:


首先入栈顺序基本上都是是右到左,因为C/C++要支持变长参数表,必须保证最左参数在栈顶。但是这个顺序和求值、副作用是两码事。


void f( int i1, int i2, int i3, int i4 ){
cout<< i1 << ' ' << i2 << ' ' << i3 << ' ' << i4 << endl;
}

int main(){
int i = 0;
f( i++, i++, i++, i++ );
}

这个有四个表达式求值,同时每个表达式都有负作用。这八个操作顺序是任意的,那么结果如何?未定义。

请用 VC7.1 Debug和 Release 分别测试这同一份代码,结果是
0 0 0 0 [release]
3 2 1 0 [debug]

根本无须解释,也不能解释。 对于编译器优化, 要明确一点: 编译器的优化不会改变语义。 正是因为语义中这里可以任意解释所以编译器才会优化。
starcloudmountain 2006-03-24
  • 打赏
  • 举报
回复
有意思
逸学堂 2006-03-24
  • 打赏
  • 举报
回复
TO:jruv
这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同
编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以
各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。
因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理
这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得
结果。最后是看编译器优化。
猞猁狲 2006-03-24
  • 打赏
  • 举报
回复
牛!学习
nipcdll 2006-03-24
  • 打赏
  • 举报
回复
学习
nightcapture 2006-03-24
  • 打赏
  • 举报
回复
m=6,n=7
b=7
superliulin 2006-03-24
  • 打赏
  • 举报
回复
好玩,以前看过,还有点印象,和编译器有关
加载更多回复(25)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧