“ else if”是语言构造还是编译器如何处理if / else构造的结果?

时间:2019-10-14 21:19:50

标签: c# syntax

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社区来将此发布到下面,但似乎不合适。

1 个答案:

答案 0 :(得分:2)

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

elseif(condition)action();可以写在一行,两行,三行或四行上;读取起来更容易,并且只需占用较少的垂直空间即可将它们全部放在一两行上。

缩进也是可选的,但出于可读性考虑,我将其包括在内。

有趣的是(至少对我来说),最难读的是第9行的示例,最后是1行的示例。

与第二个示例相比,我个人更喜欢第三个示例,因为在if之后使用单个语句而不用括起大括号就很危险(因为如果添加了另一行,则不会有条件地执行)。 / p>

示例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();

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