打印

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

[复制链接]
楼主: wwwq
手机看帖
扫描二维码
随时随地手机跟帖
21
wwwq|  楼主 | 2009-12-12 11:38 | 只看该作者 回帖奖励 |倒序浏览
18,19楼,好同志,学术就是学术。
我发此贴的意思就是想看有没有高手,尤其是搞过编译器设计的高手,看看realview设计中存在的问题,这个程序明显不符合ansi c的规范,到底是我对ansi c的理解有问题,还是realview的问题,谢谢

使用特权

评论回复
22
急驰的蚂蚁| | 2009-12-12 11:45 | 只看该作者
大家还是以讨论为好
不要刻意的攻击对方
论事不论人
牛人也有不知道的地方
更别说我们刚上道的小屁孩

使用特权

评论回复
23
desert_hawk| | 2009-12-12 11:49 | 只看该作者
本帖最后由 desert_hawk 于 2009-12-12 11:52 编辑

如果把d=b-a+1;放到c=a+b;后面,你会发现它返回的就是d的值,不能说编译器在程序没有“声明返回”的情况下就正确返回了,因为编译器并不知道你要返回哪个变量的值,只好把最后一个得到结果的变量值返回了。
如果把此函数改成:
int add(int a,int b)
{
int d,c,e;

d=b-a+1;
c=a+b;
e=c+d;

}
你会发现函数返回的是变量e的值。

使用特权

评论回复
24
香水城| | 2009-12-12 12:51 | 只看该作者
不错编译器的设计必须遵循ansi c 的规范,ANSI C的规范里说函数的返回值需要使用return返回;但并没有规定,没有使用return时,函数返回的值是什么,这个时候编译器可以返回任何数值,正因为如此,编译器才给出了warning,4楼的贴图中显示了这个warning,是楼主自己没有看清楚。

to 香水城
没必要了解它的内部机理,它怎么设计与用户无关,只要明确它必须实现C的标准即可。
wwwq 发表于 2009-12-12 10:42



既然楼主说是讨论学术问题,那么就应该有一个科学的态度。如果只是使用,可以没必要了解它的内部机理,但如果你要断言编译器有Bug,就必须全面地了解各方面的实现机理之后,才能科学地下结论。

退一步说,你认为按照ANSI C的规范来说,在没有return的情况下,引用函数的返回数值时,应该是什么内容呢?

使用特权

评论回复
25
xsgy123| | 2009-12-12 17:27 | 只看该作者
没有返回值,你的编译通得过?

使用特权

评论回复
26
voidx| | 2009-12-12 17:47 | 只看该作者
无聊的帖子。

使用特权

评论回复
27
pkat| | 2009-12-12 17:54 | 只看该作者
返回的值是对的吗,不大可能

使用特权

评论回复
28
wwwq|  楼主 | 2009-12-12 18:29 | 只看该作者
to  desert_hawk
您可以试一下,如果把d=b-a+1; 放在最后一行,返回的值仍然是0x10,这就是我认为奇怪的地方。终于有认真的认了,谢谢。
to 香水城
按照 ansi c如果没有return,严格的编译器是按照函数有类型的声明情况下报错的。

使用特权

评论回复
29
desert_hawk| | 2009-12-12 19:56 | 只看该作者
to  desert_hawk
您可以试一下,如果把d=b-a+1; 放在最后一行,返回的值仍然是0x10,这就是我认为奇怪的地方。终于有认真的认了,谢谢。
wwwq 发表于 2009-12-12 18:29

23楼所说的是我用IAR5.11验证后的结果,我没有keil,所以试不了。IAR不写return同样是警告而不是错误。个人认为这个应该不能算编译器的问题。

使用特权

评论回复
30
lxyppc| | 2009-12-12 20:43 | 只看该作者
http://flash-gordon.me.uk/ansi.c.txt


3.6.6.4 The return statement

Constraints

   A return statement with an expression shall not appear in a
function whose return type is void .

Semantics

   A return statement terminates execution of the current function and
returns control to its caller.  A function may have any number of
return statements, with and without expressions.

   If a return statement with an expression is executed, the value of
the expression is returned to the caller as the value of the function
call expression.  If the expression has a type different from that of
the function in which it appears, it is converted as if it were
assigned to an object of that type.

   If a return statement without an expression is executed, and the
value of the function call is used by the caller, the behavior is
undefined.
  Reaching the } that terminates a function is equivalent to
executing a return statement without an expression
.

楼主不知道你的ANSI C是哪个版本的

使用特权

评论回复
31
wwwq|  楼主 | 2009-12-12 20:59 | 只看该作者
my issue is why the return stmt returns the right value,although I didn't define an expression for a function with the specific type.

使用特权

评论回复
32
wwwq|  楼主 | 2009-12-12 21:00 | 只看该作者
IAR不写return同样是警告而不是错误。个人认为这个应该不能算编译器的问题。

我也觉得比较奇怪。

使用特权

评论回复
33
lxyppc| | 2009-12-12 21:04 | 只看该作者
my issue is why the return stmt returns the right value,although I didn't define an expression for a function with the specific type.
wwwq 发表于 2009-12-12 20:59


undefined就是未定义
他可以返回正确的,也可以返回错误的
他可以报警告,可以报错误,也可以什么都不报
因为未定义,没人要求他怎么做,那他可以想怎么做就怎么做

要问为什么会返回正确的值
我只能说“纯属巧合”

使用特权

评论回复
34
司徒老鹰| | 2009-12-12 21:08 | 只看该作者
半天看不出啥……

使用特权

评论回复
35
desert_hawk| | 2009-12-12 21:23 | 只看该作者
楼主一直认为编译器返回了正确值,其实编译器只返回了一个恰好你认为正确的值。如果你的本意是返回变量
d的值,那你就会认为它返回了一个错误值,很简单的一件事情。

使用特权

评论回复
36
mcuisp| | 2009-12-12 23:36 | 只看该作者
赞同楼上
反对任何攻击行为

使用特权

评论回复
37
香水城| | 2009-12-13 09:05 | 只看该作者
大家已经说了这么多,如果楼主还是不明白,那么请回答我在24楼的这个问题:“你认为按照ANSI C的规范来说,在函数没有return的情况下,引用函数的返回数值时,应该是什么内容呢?”

使用特权

评论回复
38
wwwq|  楼主 | 2009-12-13 09:16 | 只看该作者
香版主的问题,我在前面已经回答过了。
我已经询问了从事编译器设计的老师,这个结果是编译器的问题,可以认为其没有完全体现出ansi c的规范,即在有确定返回类型的函数里,没有return时,应该报错,各位可以看看C#的函数设计。谢谢

使用特权

评论回复
39
wwwq|  楼主 | 2009-12-13 09:19 | 只看该作者
一个好的编译器是应该从用户角度出发的。各位可以试试realview中的FOR语句设计,所有变量均要在函数的前面声明。总之没必要迷信这些国外公司,国内的编译器虽然落后,但也不是别人的就好的不得了。

使用特权

评论回复
40
香水城| | 2009-12-13 09:29 | 只看该作者
本帖最后由 香水城 于 2009-12-13 09:43 编辑
香版主的问题,我在前面已经回答过了。
我已经询问了从事编译器设计的老师,这个结果是编译器的问题,可以认为其没有完全体现出ansi c的规范,即在有确定返回类型的函数里,没有return时,应该报错,各位可以看看C# ...
wwwq 发表于 2009-12-13 09:16


1)你认为30楼给出的那段文本中,这句话如何解释:“the behavior is undefined.

2)你可以再向那位从事编译器设计的老师询问一下有关什么是“强类型语言”的问题,看看他怎么说?

3)你说“一个好的编译器是应该从用户角度出发的”,那么你认为Warning和Error有什么区别?Warning是不是从用户角度出发?

----------------------------------
又回顾了一下前面的帖子,发现楼主对我24楼问题的回答是:按照 ansi c如果没有return,严格的编译器是按照函数有类型的声明情况下报错的。如果这就是你的回答,你就需要好好解释我上面的问题1和问题3。

还有一个问题是“什么叫严格的编译器”?难道把应该提示Warning的地方改为提示Error就是严格吗?把规范中未定义的动作都提示为Error吗?

使用特权

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

本版积分规则