起因
事情是这样的:
俺在一个Delphi交流QQ群,有点冷场,俺想热一下场子就发了下面这个段子。其实这是之前俺带新人时的一道题目。
第一个回答
第一个网友给的答案是 i:=i-1;
俺说这个答案是不对的,因为 Delphi在编译时是不允许出现这样的代码,Delphi会自动检查。
[Error] Unit1.pas(35): Assignment to FOR-Loop variable 'i'
第二个回答
使用汇编,Delphi下用汇编还是比较方便的。不过我告诉网友,这个回答是可以的,但是不是一句。因为用汇编的话
ASM
MOVE
........
END;
这样就不是一句代码了,
后面还有几个网友也参与了讨论,但是都不是一句代码。
答案
有很多种,下面是其中之一
pint(@i)^ := 11;
var
i, c: integer;
begin
c := 0;
for i := 1 to 10 do
begin
pint(@i)^ := 11; // 加一句代码 使for循环 变成 死循环
c := c + 1;
end;
showmessage(inttostr(c));
end;
其实这个题目还有个更容易理解的答案。
var
i, c: integer;
procedure proc(var v: integer);
begin
v := 11;
end;
begin
c := 0;
for i := 1 to 10 do
begin
proc(i); // 加一句代码 使for循环 变成 死循环
c := c + 1;
end;
showmessage(inttostr(c));
end;
我在设计这道题目时,打算以这道题目作为切入点,讲解一下几个知识点
- For循环
- 整数类型
- 指针的使用
- 过程参数的声明
这个题目看上去简单,但是是一个不错的切入点。
其实这个面试题来自于 俺以前在delphibbs上回答一个网友的问题
问题:delphi 的 for循环问题(人穷没分 帮忙啊,问题不难的)( 积分:0, 回复:12, 阅读:176) 来自:wuyuede, 时间:2008-09-17 15:16, ID:3921691 |
在看教程时,对于for的用法都是简单介绍的,没有看到过 对步值的讲解,我想问一下在delphi中能否像 c语言里一样 可以控制 sept 来控制步值? delphi 中到底能否控制步值?还是只能 加一或者 减一来控制循环? |
来自:tlzmm_2008, 时间:2008-09-17 15:26, ID:3921694 |
For 循环语句,不能控制步长,担while语句可以做到。 |
来自:levi, 时间:2008-09-17 16:24, ID:3921711 |
for 只能 to 或者 dwonto 步长为1或-1, 没法改变步长 |
来自:xingxin00, 时间:2008-09-17 16:30, ID:3921714 |
步长不能改变,只能加一或减一, |
来自:szhcracker, 时间:2008-09-17 16:41, ID:3921720 |
是downto |
来自:xingxin00, 时间:2008-09-17 16:42, ID:3921721 |
只能+1或-1; |
来自:liugaohui, 时间:2008-09-17 21:29, ID:3921791 |
不能,但是可以变通 |
来自:creation-zy, 时间:2008-09-17 22:25, ID:3921806 |
Delphi的For循环有特殊的优化机制——只能执行简单增量或减量,可以使用最简单的机 器指令,效率极高。如果步长可以变化,那么就需要额外的指令以加入步长值,从而降低效 率。 如果确实需要实现其它步长的循环,完全可以用while或repeat循环——别忘了这帮For的 好兄弟哟。 :) |
俺的回答
来自:hfghfghfg, 时间:2008-11-22 10:53, ID:3931562 |
可以变步长啊。 procedure TForm1.Button1Click(Sender: TObject); var c, i: integer; p: PInteger; begin c := 0; for i := 1 to 10 do begin if i = 5 then begin p := @i; inc(p^); end; inc(c); end; ShowMessage(inttostr(c)); end; 结果 是 9 |
来自:hfghfghfg, 时间:2008-11-22 10:55, ID:3931563 |
procedure TForm1.Button1Click(Sender: TObject); var c, i: integer; p: PInteger; begin c := 0; for i := 1 to 100 do begin if i = 5 then begin p := @i; p^ := p^ + 80; end; inc(c); end; ShowMessage(inttostr(c)); end; 结果 是 20 总之 i可以 随你变 不过 小心 死循环 for 的 结束 是 相等跳 |