rrang
2009-12-11 18:56
楼主
main()
{
int a=8;
int b=0;
b=a;
b=add(a,b);
a=a+b;
}
int add(int a,int b)
{
int d,c;
d=b-a+1;
c=a+b;
}
这是最简单的程序,居然运行正确?奇怪,大家看看
}
但这个问题不符合ANSI C的规范,因此还是可以认为是KEIL的一个bug,其实我们陆续发现了多个错误,也和应贝特联系过,感觉其实realview的问题还是比较多的
但这个问题不符合ANSI C的规范,因此还是可以认为是KEIL的一个bug,其实我们陆续发现了多个错误,也和应贝特联系过,感觉其实realview的问题还是比较多的 ...
在你没有搞清楚它的内部实现机理的时候,请不要轻易断言Bug。
你所碰到的问题,2楼说的对,这只是一个巧合,与Bug无关。
C编译器一般是不做返回规则检查的,你不写返回默认你不需要。
这不是编译器的BUG,完全属于你知识点的BUG ,呵呵,说的难听点就是针对这个你‘无知’了
to yewuyi:
请勿轻言无知,如果你知道编译器的设计必须遵循ansi c 的规范的话,这句话你会咽回去的。
这点是编译原理的常识。
我贴出来的程序表明此编译器没有在程序声明return ,并明确返回值时,就“正确的”返回了,请各位先运行一下看看,add返回的是0x10,为什么不返回d的值,而是返回C的值?
这是科学讨论,毕竟realview就是一个编译器产品。
to 香水城
没必要了解它的内部机理,它怎么设计与用户无关,只要明确它必须实现C的标准即可。
LZ,编译器的警告难道你看不见吗?
而且,你从哪里确定“居然运行正确”的?
这个应该是错误的程序,请你先运行一下,单步调试完再说。
在一个错误的基础上面讨论个P
难道楼主的编译后,没有警告?
本贴因被人投诉有骂娘嫌疑,特做处理
你别说,还真没有,我刚起来,
这都被你猜出来,看来我们果然不在同一级别
嗯,好吧:realview有弱智的BUG,大家以后写程序都按楼主的良好风格去写.
大家以后注意了,
"在一个错误的基础上面讨论个P" == "骂娘"
以后发言千万注意.
ATPCS规则:
1.结果为一个32位的整数时,通过寄存器R0返回.
2.结果为一个64位整数时,通过R0和R1返回,依此类推.
楼主的add函数中,变量c的结果恰好存储在R0中,所以运行起来碰巧正确。
如果楼主的本意是返回d而没有写return,结果就是错的了。
我顶
21ic最近怎么都变成对骂的地方了
很不明白???
不就一个问题吗?
LZ看下反汇编
再了解下C编译成汇编参数是怎么传的 返回值又是怎么返回的就ok了
假如想更深入的了解的话 就弄明白局部变量放在什么地方 全局变量放在什么地方 堆和栈的区别
在一个C语言中 数据段是怎么安排的
个人觉得还是从基础上分析问题比较稳妥点
先把原理弄懂来
个人意见
[quote]to yewuyi:
请勿轻言无知,如果你知道编译器的设计必须遵循ansi c 的规范的话,这句话你会咽回去的。
这点是编译原理的常识。
我贴出来的程序表明此编译器没有在程序声明return ,并明确返回值时,就“正确的”返回 ...
[/quot
呵呵,你的问题在2楼就已经被正确回答过了,你还在这纠结什么?不知道答案也就罢了,当别人给了你正确答案并解释清楚后,你还这样纠结,让我等实在佩服的不得了。。。
你继续折腾玩把。。。