[考题]关于局部变量

s11ss 2012-08-10 11:48:29

procedure TForm1.FormCreate(Sender: TObject);
var
S: string;
I: Integer;
begin
for I := 1 to 3 do
S := S + IntToStr(I);
ShowMessage(S);
end;

请指出以上代码可能出现的问题。
...全文
1340 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
biganchor 2012-08-25
  • 打赏
  • 举报
回复
此代码的问题就是s变量未初始化,结果是不确定的。
使用string类型作为局部变量,建议还是要初始化为'',这在d7和d2010我都作为观察(未实际看过汇编码),在某些频繁调用的例程中,不作初始化的变量,得到的结果是未知的。
现在抛开汇编码来讲,谁能提供一下资料证明,delphi中string局部变量,编译器会加入初始化代码呢?
panzi667 2012-08-23
  • 打赏
  • 举报
回复
不解,我来踩踩..
yhcustc 2012-08-22
  • 打赏
  • 举报
回复
没有看出什么问题,请说出什么却别
丛林隐者 2012-08-21
  • 打赏
  • 举报
回复
不好意思函数忘写了个var,应该是

procedure XXX(var S : String);
begin
S := S + 'ab'
end;
丛林隐者 2012-08-21
  • 打赏
  • 举报
回复
Function XXX : String;
begin
Result := Result + 'ab'
end;
函数等同于

procedure XXX(S : String);
begin
S := S + 'ab'
end;
所以不初始化的话,实际上会使用外部的值,所以要注意。
当遇到不解的问题时,需要查看汇编代码,才能找到到问题的实质。如下:
Function XXX : String;
asm
XOR EAX , EAX
end;

var
S : String;
begin
S := 'aaaa';
S := XXX;
ShowMessage(S); //结果还是 aaaa
end;
上面S的结果还是aaaa是因为XXX函数仅仅把传入的eax值设置为了0,而ShowMessage(S)代码,实际上是一个局部变量的地址[ebp-4],此值并没有变化,所以结果还是aaaa,所以当遇到问题的时候,最终需要查看汇编码来得到答案,大家不要随意下结论。学术要严谨。
hsfzxjy 2012-08-10
  • 打赏
  • 举报
回复
有问题吗
s11ss 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
窗体出现前显示一个内容为 “123” 的提示框。

不清楚你想提出什么议题
[/Quote]你不觉得代码有问题吗
「已注销」 2012-08-10
  • 打赏
  • 举报
回复
不解!!!
广州佬 2012-08-10
  • 打赏
  • 举报
回复
窗体出现前显示一个内容为 “123” 的提示框。

不清楚你想提出什么议题
s11ss 2012-08-10
  • 打赏
  • 举报
回复
+1[Quote=引用 43 楼 的回复:]
返回值类型为 string、动态数组等引用计数管理类型时,实际上是传入隐含参数进行处理。否则如果在栈中使用临时变量的话,由于在函数退出前会对栈中变量进行清理,从而无法正确管理引用计数,导致无法正确实现函数应有的功能。类似的情况,如返回值类型不是很简单的 record 的话,也是采用隐含参数的方式处理的,从而避免在退出函数后仍使用已经失效的栈空间、减少复制变量的开销,各大语言基本上都采用这种方式处理……
[/Quote]
Seamour 2012-08-10
  • 打赏
  • 举报
回复
返回值类型为 string、动态数组等引用计数管理类型时,实际上是传入隐含参数进行处理。否则如果在栈中使用临时变量的话,由于在函数退出前会对栈中变量进行清理,从而无法正确管理引用计数,导致无法正确实现函数应有的功能。类似的情况,如返回值类型不是很简单的 record 的话,也是采用隐含参数的方式处理的,从而避免在退出函数后仍使用已经失效的栈空间、减少复制变量的开销,各大语言基本上都采用这种方式处理的。
zzmjhy520 2012-08-10
  • 打赏
  • 举报
回复
我的那段代码把 if cbbBrand.ItemIndex <> -1 then 换成 if cbbBrand.Items.IndexOf(cbbBrand.Text)>-1 then 后,我所说的那种情况就没出现了,很费解
zzmjhy520 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 的回复:]

不可能吧?引用 35 楼 的回复:
引用 34 楼 的回复:

当 cbBrand.Checked 为 False,或 cbbBrand.ItemIndex = -1 时,sqlText 总是 'select * from Table_A t where 1=1'啊!

这样的情况:
第一次调用时:cbBrand.Checked 为 true, cbbBrand.ItemIndex……
[/Quote]
我的combobox是用的comboboxex,可过滤内容的,这个控件用到了全局钩子,我的这种情况很可能和这个有关
Hexpate 2012-08-10
  • 打赏
  • 举报
回复
其实xxx就是等同如下的调用
procedure yyy(var s: string);
asm
xor eax, eax
end;

蓝色光芒 2012-08-10
  • 打赏
  • 举报
回复
Function XXX : String;
asm
XOR EAX , EAX
end;

var
S : String;
begin
S := 'aaaa';
S := XXX;
ShowMessage(S); //结果还是 aaaa, 明白了吧
zzmjhy520 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 的回复:]

引用 34 楼 的回复:

当 cbBrand.Checked 为 False,或 cbbBrand.ItemIndex = -1 时,sqlText 总是 'select * from Table_A t where 1=1'啊!

这样的情况:
第一次调用时:cbBrand.Checked 为 true, cbbBrand.ItemIndex <> -1 时,
sql……
[/Quote]
这个真可能,我showmessage出来看到的
kaikai_kk 2012-08-10
  • 打赏
  • 举报
回复
讨论跑题了,不是讨论局部变量初始化的问题吗,怎么变成讨论函数返回值了。。。
想探究竟打开CPU窗口,就清楚了; 凭经验说说我的见解,不对的地方请见谅哈

像string,integer等这些32位简单数据类型是通过EAX返回的
像下面的代码就是一句ret返回了,并不做其它的动作(不会改变你的EAX内容)
所以原来的EAX内容是什么还是什么,而使用result、函数名返回、或用var传址方式等,操作的是EAX,所以内容就会改变
Function XXX : String;
begin
end;
s11ss 2012-08-10
  • 打赏
  • 举报
回复
不可能吧?[Quote=引用 35 楼 的回复:]
引用 34 楼 的回复:

当 cbBrand.Checked 为 False,或 cbbBrand.ItemIndex = -1 时,sqlText 总是 'select * from Table_A t where 1=1'啊!

这样的情况:
第一次调用时:cbBrand.Checked 为 true, cbbBrand.ItemIndex <> -1 时,
sqlTex……
[/Quote]
zzmjhy520 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 的回复:]

当 cbBrand.Checked 为 False,或 cbbBrand.ItemIndex = -1 时,sqlText 总是 'select * from Table_A t where 1=1'啊!
[/Quote]
这样的情况:
第一次调用时:cbBrand.Checked 为 true, cbbBrand.ItemIndex <> -1 时,
sqlText:=select * from Table_A t where 1=1 and t.brand_name ='abcd';
第二次调用时cbBrand.Checked 为 true, cbbBrand.ItemIndex = -1 时,
sqlText的值和第一次一样
s11ss 2012-08-10
  • 打赏
  • 举报
回复
当 cbBrand.Checked 为 False,或 cbbBrand.ItemIndex = -1 时,sqlText 总是 'select * from Table_A t where 1=1'啊!
加载更多回复(29)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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