【问题标题】:Is "else if" a language construct or a consequence of how the compiler treats the if/else construct?“else if”是一种语言结构还是编译器如何处理 if/else 结构的结果?
【发布时间】:2019-10-14 21:19:50
【问题描述】:

if/else 语句的可接受语法很灵活。在像 C# 这样的语言中,要执行的代码可以与条件检查在同一行,也可以在新行上,无论是否缩进,是否在大括号内。这种灵活性引发了这样一个问题:else if 块到底是一种实际的语言结构,还是仅仅是if/else 语句的灵活性的结果。

考虑这段代码:

// Version 1
if (condition1)
  // do something
else if (condition2)
  // do something else
else
  // do some third thing

这段代码可以用语法不同但语义相同的方式重写:

// Version 2
if (condition1)
  // do something
else
{
  if (condition2)
    // do something else
  else
    // do some third thing
}

else 块周围的大括号是可选的,因为 if/else 被认为是用于大括号用途的单个语句,因此另一个语义相同的迭代将是:

// Version 3
if (condition1)
  // do something
else
  if (condition2)
    // do something else
  else
    // do some third thing

当然,版本 1 和版本 3 之间没有明显区别,因为 C# 不尊重空格。那么,很自然的问题是,else if 是 C#(或一般的 C 系列语言)中内置的实际功能,还是仅仅是聪明的软件开发人员很久以前发现的灵活语法的有用结果。

我已经尝试编写程序来测试这种行为并尝试梳理出潜在的行为,但是我无法编写能够成功区分这两种语法的程序。要么我不够聪明,要么差异相当微妙。我还搜索了一个不同的 SE 社区来发布此内容,但似乎没有一个合适的。

【问题讨论】:

  • "要执行的代码可以是...在大括号内或不在大括号内" 仅当它是单行时。否则需要大括号
  • 某些语言有一个单独的ElseIf 关键字。 C# 没有。我不会在 C# 中将 else if 称为单独的语言结构。
  • @RufusL 然而,版本 3 的工作方式与版本 1 (AFAICT) 完全一样,没有大括号。正如 OP 所建议的那样,"if/else 被认为是用于大括号使用目的的单个语句"(我实际上从来不知道这一点)。
  • @AhmedAbdelhameed 如果// do some third thing 由多个语句组成,则不会,因为如果是,则只有第一个语句会有条件地执行,其余的每次都会执行。同样适用于其他 // do something 行,但如果这些是多个语句,则会出现编译错误,因为没有if 就不能有else,第二个语句将与原创if.
  • @RufusL 是的,当然。看来你一开始就是这个意思。我以为你在争论第三版中的else 分支确实需要大括号。

标签: c# syntax


【解决方案1】:

不,else if 不是语言功能 - 它只是语句之间空格的不同用法。

elseif(condition)action();可以写在一、二、三或四行;它只是更容易阅读并且占用更少的垂直空间将它们全部放在一两行。

缩进也是可选的,但我将它包括在内是为了便于阅读。

有趣的是(至少对我而言),第一个 9 行示例和最后一个 1 行示例是最难阅读的。

我个人更喜欢第三个示例而不是第二个示例,因为在 if 之后有一个不包含花括号的语句感觉很危险(因为如果添加了另一行,它将不会有条件地执行)。

示例 1(9 行)

if
    (condition1)
    DoSomething();
else
if
    (condition2)
    DoSomethingElse();
else
    DoAThirdThing();

示例 2(6 行)

if (condition1) 
    DoSomething();
else if (condition2) 
    DoSomethingElse();
else 
    DoAThirdThing();

示例 3(3 行)

if (condition1) DoSomething();
else if (condition2) DoSomethingElse();
else DoAThirdThing();

示例 4(1 行)

if(condition1)DoSomething();else if(condition2)DoSomethingElse();else DoAThirdThing();

请注意,如果可执行操作部分包含多个语句,则必须用大括号括起来。

【讨论】:

  • 我开始怀疑是这种情况,但正如我在问题中提到的那样,我很难设计一个将这两种形式分开的测试。感谢您的信息。我实际上并没有意识到您的第一个示例甚至可以编译 - 我一直认为这将是一个语法错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2022-08-18
  • 2021-03-07
相关资源
最近更新 更多