【发布时间】: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分支确实需要大括号。