一道Delphi的For循环题目

起因

事情是这样的:

俺在一个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 的 结束 是 相等跳
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月巴月巴白勺合鸟月半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值