打印

结贴!学术成了骂娘了,没劲return也能返回

[复制链接]
10710|69
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wwwq|  楼主 | 2009-12-11 18:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 wwwq 于 2009-12-12 11:13 编辑

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;

}
这是最简单的程序,居然运行正确?奇怪,大家看看


}
沙发
voidx| | 2009-12-11 20:52 | 只看该作者
本帖最后由 voidx 于 2009-12-13 09:42 编辑

无聊的帖子。
如有雷同,纯属巧合。

使用特权

评论回复
板凳
wwwq|  楼主 | 2009-12-11 21:26 | 只看该作者
但这个问题不符合ANSI C的规范,因此还是可以认为是KEIL的一个bug,其实我们陆续发现了多个错误,也和应贝特联系过,感觉其实realview的问题还是比较多的

使用特权

评论回复
地板
aozima| | 2009-12-12 00:35 | 只看该作者

使用特权

评论回复
5
香水城| | 2009-12-12 08:41 | 只看该作者
但这个问题不符合ANSI C的规范,因此还是可以认为是KEIL的一个bug,其实我们陆续发现了多个错误,也和应贝特联系过,感觉其实realview的问题还是比较多的 ...
wwwq 发表于 2009-12-11 21:26


在你没有搞清楚它的内部实现机理的时候,请不要轻易断言Bug。

你所碰到的问题,2楼说的对,这只是一个巧合,与Bug无关。

使用特权

评论回复
6
yewuyi| | 2009-12-12 09:02 | 只看该作者
C编译器一般是不做返回规则检查的,你不写返回默认你不需要。

这不是编译器的BUG,完全属于你知识点的BUG ,呵呵,说的难听点就是针对这个你‘无知’了

使用特权

评论回复
7
wwwq|  楼主 | 2009-12-12 10:40 | 只看该作者
to yewuyi:
请勿轻言无知,如果你知道编译器的设计必须遵循ansi c 的规范的话,这句话你会咽回去的。
这点是编译原理的常识。
我贴出来的程序表明此编译器没有在程序声明return ,并明确返回值时,就“正确的”返回了,请各位先运行一下看看,add返回的是0x10,为什么不返回d的值,而是返回C的值?
这是科学讨论,毕竟realview就是一个编译器产品。

使用特权

评论回复
8
wwwq|  楼主 | 2009-12-12 10:42 | 只看该作者
to 香水城
没必要了解它的内部机理,它怎么设计与用户无关,只要明确它必须实现C的标准即可。

使用特权

评论回复
9
xwj| | 2009-12-12 10:52 | 只看该作者
LZ,编译器的警告难道你看不见吗?

而且,你从哪里确定“居然运行正确”的?

使用特权

评论回复
10
wwwq|  楼主 | 2009-12-12 10:57 | 只看该作者
这个应该是错误的程序,请你先运行一下,单步调试完再说。

使用特权

评论回复
11
wwwq|  楼主 | 2009-12-12 10:58 | 只看该作者
希望大家运行,单步调试一下再来讨论。

使用特权

评论回复
12
aozima| | 2009-12-12 11:04 | 只看该作者
本帖最后由 aozima 于 2009-12-12 11:25 编辑

在一个错误的基础上面讨论个P
难道楼主的编译后,没有警告?


本贴因被人投诉有骂娘嫌疑,特做处理

使用特权

评论回复
13
wwwq|  楼主 | 2009-12-12 11:05 | 只看该作者
警告不是错误,这里应该错误。
楼上的刷牙了吗?

使用特权

评论回复
14
aozima| | 2009-12-12 11:07 | 只看该作者
你别说,还真没有,我刚起来,
这都被你猜出来,看来我们果然不在同一级别
嗯,好吧:realview有弱智的BUG,大家以后写程序都按楼主的良好风格去写.

使用特权

评论回复
15
wwwq|  楼主 | 2009-12-12 11:09 | 只看该作者
当然,水平不一样,脑子是思维的,不是骂人的

使用特权

评论回复
16
aozima| | 2009-12-12 11:13 | 只看该作者
当然,水平不一样,脑子是思维的,不是骂人的
wwwq 发表于 2009-12-12 11:09

受教了,学习..

使用特权

评论回复
17
aozima| | 2009-12-12 11:24 | 只看该作者
大家以后注意了,
"在一个错误的基础上面讨论个P" == "骂娘"
以后发言千万注意.

使用特权

评论回复
18
desert_hawk| | 2009-12-12 11:31 | 只看该作者
ATPCS规则:
   1.结果为一个32位的整数时,通过寄存器R0返回.
    2.结果为一个64位整数时,通过R0和R1返回,依此类推.
楼主的add函数中,变量c的结果恰好存储在R0中,所以运行起来碰巧正确。
如果楼主的本意是返回d而没有写return,结果就是错的了。

使用特权

评论回复
19
急驰的蚂蚁| | 2009-12-12 11:35 | 只看该作者
我顶
21ic最近怎么都变成对骂的地方了
很不明白???
不就一个问题吗?
LZ看下反汇编
再了解下C编译成汇编参数是怎么传的 返回值又是怎么返回的就ok了
假如想更深入的了解的话 就弄明白局部变量放在什么地方 全局变量放在什么地方 堆和栈的区别
在一个C语言中 数据段是怎么安排的
个人觉得还是从基础上分析问题比较稳妥点
先把原理弄懂来
个人意见

使用特权

评论回复
20
yewuyi| | 2009-12-12 11:36 | 只看该作者
[quote]to yewuyi:
请勿轻言无知,如果你知道编译器的设计必须遵循ansi c 的规范的话,这句话你会咽回去的。
这点是编译原理的常识。
我贴出来的程序表明此编译器没有在程序声明return ,并明确返回值时,就“正确的”返回 ...
wwwq 发表于 2009-12-12 10:40 [/quot


呵呵,你的问题在2楼就已经被正确回答过了,你还在这纠结什么?不知道答案也就罢了,当别人给了你正确答案并解释清楚后,你还这样纠结,让我等实在佩服的不得了。。。

你继续折腾玩把。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

118

帖子

0

粉丝