-2

我在一个过程中使用这个代码,我遇到了第一个 if 子句的问题:

procedure TForm1.Button1Click(Sender: TObject);
var i,indice,n,conto:integer;
    a:string;
begin
  indice:=1;
  conto:=0;

  Memo2.Lines.Add('<tr>');

  for i := 1 to 649 do
   begin
    if ((i <> 11) or (i mod 11 <> 0)) then
     begin
      proced4();
     end
    else
     begin
      Memo2.Lines.Add('</tr><tr>');
      proced5();
    end;
   end;
end;

我有一个从 1 到 649 的 for。当索引是 11 的倍数时,11, 22, 33, 44...我必须调用

Memo2.Lines.Add('</tr><tr>');
proced5();

使用我编写的代码,只有当索引 i 为 11 时,代码才会调用 proced5()。但是,例如,当 i 为 22 或 33 时,它会执行 proced4() 而不是 proced5()。

我怎样才能解决这个问题?

4

1 回答 1

10

if 测试没有意义:

i mod 11 <<-- will be 0 for any multiple of 11. (including 0) 
(i <> 11)  <<-- superflous, the mod already does the job.

同样为了理智,最好总是让你的 if 测试一些积极的东西。
人类不擅长解析否定。

  for i := 1 to 649 do begin
    if ((i mod 11) = 0) then begin
      Memo2.Lines.Add('</tr><tr>');
      procedureWithAMeaningfulName5();
    end else {if not multiple of 11 then} begin
      procedureWithAMeaningfulName4();
    end;
  end; {for}

对编码风格的注释
函数和变量名称应该表明它们的含义。

`Button1`: bad, what does the button do? Should e.g. `ButtonBuildHTMLTable`  
`proced5`: what the hell does that do?? Give it a meaningful name.  
`indice`: Index of what?
`conto`: count of what?

您的缩进不一致;你知道按下CTRL + D会让 Delphi 自动为你缩进你的代码吗?

为什么你的代码不起作用

让我们分开测试。

if ((i <> 11) or (i mod 11 <> 0)) then
  1. 如果(i <> 11) 为真或 (i mod 11 <> 0) 为真,则 or返回。true
  2. (i <> 11) 几乎总是正确的,除非 i = 11。
  3. 因此测试 B:(i mod 11 <> 0)只有在 (i = 11) 时才会被测试。
  4. 在所有其他情况下proced4();运行。
  5. 案例 i=22、i=33 等不符合测试,因此不触发 else not(i <> 11)(i = 11)
  6. 注意第 5 点的双重否定,这就是为什么 if 语句应该测试一些积极的东西。
于 2013-10-09T21:29:12.167 回答