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

发布于 2024-12-06 19:44:02 字数 281 浏览 0 评论 0原文

我通常是一名 C# 程序员,使用 Delphi 充满了“有趣”的发现。最让我困惑的是 Delphi 中的单个语句。

C# 块示例

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

Delphi 块示例:

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

要求不存在分号的确切目的是什么?是否有可以追溯到帕斯卡的历史原因?

I'm usually a C# programmer and going to Delphi has been full of "interesting" discoveries. The one that baffles me the most is single statements in Delphi.

Example C# block

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

Example Delphi block:

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

What exactly was their purpose for requiring that semi-colon to not be there? Is there a historical reason dating back to Pascal?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

﹏雨一样淡蓝的深情 2024-12-13 19:44:03

Pascal 和 C 及其派生语言中的分号之间存在差异。

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

维基百科解释了这一点的含义:

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

  • Pascal 中 else 之前不能直接有分号
    而在 C 中它是强制性的(除非使用块语句)
  • 结束前的最后一个语句后面不需要跟着
    一个分号

可以在最后一行end之前添加多余的分号,
从而正式插入一个空语句。

There is a difference between semi-colons in Pascal and in C and their derivatives.

  • In C the semi-colon is a statement terminator.
  • In Pascal the semi-colon is a statement separator.

Wikipedia explains the implications of this:

This difference manifests itself primarily in two situations:

  • there can never be a semicolon directly before else in Pascal
    whereas it is mandatory in C (unless a block statement is used)
  • the last statement before an end is not required to be followed by
    a semicolon

A superfluous semicolon can be put on the last line before end,
thereby formally inserting an empty statement.

赠佳期 2024-12-13 19:44:03

; 不允许出现在 if-then else 前面的真正原因是为了避免与其鲜为人知的表亲 产生歧义。 case-of 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

如果省略 ;,则 else 属于 if a=1

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

个人曾在 Pascal 中工作过二十多年来,我仍然把 ; 放在 else 前面,因为我把 ; 放在 C 风格中。编译器仍然困扰着我,你认为编译器现在应该已经学会了。

The real reason ; is not allowed in front of a if-then else is to avoid ambiguity with its lesser known cousin, the case-of else.

Observe the following snippet:

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

Because there is a ; after the 'oops' line, the else belongs to the case statement and not the if.

If you leave out the ; then the else belongs to the if a=1.

That's why a ; is not allowed in front of an if else.

Personally having worked in Pascal for some 20-odd years, I still put ; in front of else, because I put ; in C-style. And the compiler still bugs me, you'd think the compiler would have learned by now.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文