为什么“单一语句”块不需要使用分号?

问题描述 投票:18回答:2

我通常是一名C#程序员,去Delphi充满了“有趣”的发现。让我感到困惑的是德尔福的单一陈述。

示例C#block

if(x) 
  Foo();
else
  Bar();

示例Delphi块:

if x then
  Foo() //note missing semicolon
else
  Bar();

他们要求分号不在那里的目的究竟是什么?有没有可以追溯到Pascal的历史原因?

delphi block
2个回答
31
投票

Pascal中的分号与C及其衍生物之间存在差异。

  • 在C中,分号是语句终止符。
  • 在Pascal中,分号是一个语句分隔符。

Wikipedia解释了这个含义:

这种差异主要表现在两种情况:

  • 在Pascal中,它之前永远不会有分号,而在C中它是强制性的(除非使用块语句)
  • 结束前的最后一个语句不需要后跟分号

一个多余的分号可以在结束前放在最后一行,从而正式插入一个空语句。


27
投票

真正的原因;不允许在if-then else面前避免与其鲜为人知的堂兄,else的情况模棱两可。

请观察以下代码段。

case enum1 of
  male: writeln('hallo');
  female: if a=1 then writeln('oops');  <<-- watch this space.
  else writeln('neither')
end; 

因为在oops行之后有一个;,else属于case语句而不是if。如果你遗漏了;,那么其他人属于a = 1 if

这就是为什么;不允许在if前面。

我个人在Pascal工作了大约20多年,我仍然把;放在其他方面,因为我把;放在C风格。并且编译器仍然让我烦恼,你认为编译器现在已经学会了。

© www.soinside.com 2019 - 2024. All rights reserved.