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

时间:2011-09-27 19:25:42

标签: delphi block

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

示例C#block

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

示例Delphi块:

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

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

2 个答案:

答案 0 :(得分:31)

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

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

Wikipedia解释了这个含义:

  

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

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

一个多余的分号可以在结尾前放在最后一行,   从而正式插入空白的陈述。

答案 1 :(得分: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

这就是为什么;

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