大家来找bug,很简单的函数

howardneil2007 2007-10-16 09:56:19
int max(int a[10],int length,int& val)
{
int index=0;
val=a[0];
for(int i=0;i<length;i++)
if(val<a[i]) {
val=a[i];
index=i;
}
return index;
}

第一种输出
int val=0,a[10]={3,1,4,-5,33,-75,22,21,54,100};
cout<<max(a,10,val)<<'\t'<<val<<endl;
第二种输出
int val=0,a[10]={3,1,4,-5,33,-75,22,21,54,100};
cout<<max(a,10,val)<<'\t';
cout<<val<<endl;
两种结果居然不一样
第一种输出的是9 0
第二种输出的是正确结果9 100
请问这为什么?
...全文
140 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
howardneil2007 2007-10-22
  • 打赏
  • 举报
回复
看不懂
我太菜了
能说简单点吗
oakfire 2007-10-22
  • 打赏
  • 举报
回复
简单版本就是:COUT<<从右向左取得需要输出的内容,然后从左到右一起输出。先入者后出,所以就用栈喽。取得val值时 max函数还没被执行,val就是当0入栈了。等max执行后,已经不能修改栈里的0了!
JonathanS666 2007-10-22
  • 打赏
  • 举报
回复
int test( int & val )
{
val = 1;
return 0;
}

int main()
{
int val = 0;
cout << test(val) << val << endl;
}

lz的目的是输出0 1,但结果输出的是0 0。汇编代码如下,可以看出原因。
编译器先将val入栈即初始值0,然后将test的值保存到eax然后入栈,再调用ostream::operator<< 方法,val显示的就是初始值。
造成这个结果是cout的具体实现。每个<< 返回的是一个ostream&,依次对栈中的参数进行输出。

25: int val = 0;
00411708 C7 45 FC 00 00 00 00 mov dword ptr [ebp-4],0
26: cout << TTTT(val) << val << endl;
0041170F 68 0F 10 40 00 push offset @ILT+10(endl) (0040100f)
00411714 8B 45 FC mov eax,dword ptr [ebp-4]
00411717 50 push eax
00411718 8D 4D FC lea ecx,[ebp-4]
0041171B 51 push ecx
0041171C E8 02 F9 FE FF call @ILT+30(TTTT) (00401023)
00411721 83 C4 04 add esp,4
00411724 50 push eax
00411725 B9 60 E0 42 00 mov ecx,offset cout (0042e060)
0041172A E8 61 FE FF FF call ostream::operator<< (00411590)
0041172F 8B C8 mov ecx,eax
00411731 E8 5A FE FF FF call ostream::operator<< (00411590)
00411736 8B C8 mov ecx,eax
00411738 E8 C8 F8 FE FF call @ILT+0(ostream::operator<<) (00401005)
howardneil2007 2007-10-21
  • 打赏
  • 举报
回复
我不明白
这和压栈有什么关系啊
KevinCEC 2007-10-16
  • 打赏
  • 举报
回复
压栈是从右左的,val被压栈时,函数max还没被执行,所以输出的是0
drowdrow 2007-10-16
  • 打赏
  • 举报
回复
cout从右向左执行
ckt 2007-10-16
  • 打赏
  • 举报
回复
压栈是从右左的,val被压栈时,函数max还没被执行,所以输出的是0
wjkgz 2007-10-16
  • 打赏
  • 举报
回复
应该是输出计算是从左到右,还是从右到左的问题。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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