如果C#中存在语句,是否执行其他操作?

如果C#中存在语句,是否执行其他操作?,c#,.net,if-statement,C#,.net,If Statement,我在C#中遇到了以下代码 我的一些同事告诉我,这是一个else if语句。然而,我确信它实际上是一个多层嵌套的if-else语句。我知道如果没有分隔符,{},则在if或else中允许有一条语句。因此,在本例中,我认为它相当于以下代码 if(condition0) statement0; else if(condition1) statement1; else if(condition2) statement2; else if(con

我在C#中遇到了以下代码

我的一些同事告诉我,这是一个
else if
语句。然而,我确信它实际上是一个多层嵌套的
if-else
语句。我知道如果没有分隔符,
{}
,则在
if
else
中允许有一条语句。因此,在本例中,我认为它相当于以下代码

if(condition0) 
  statement0;
else
  if(condition1)
    statement1;
  else
    if(condition2)
      statement2;
    else
      if(condition3)
        statement3;
      else
      ...
请注意,我所更改的只是空格。 此缩进之所以有效,是因为在没有分隔符的情况下,每个
else
都返回到最近的
if
语句


有谁能澄清一下,编译器对第一个示例中的
else-if
格式的处理是否与第二个示例中嵌套的
if-else
格式不同?

它是一种多层if-else格式

其原因与c#语法规则有关。
else
后面跟着一条语句,任何
if
链都符合语句的条件。

在C#中没有“else-if”语句


就这点而言,我不知道C#中有任何多词语句关键字。

你是对的。它只是一个
else
后跟一个
,如果你是正确的;在C#中没有“else if”语句。它只是一个else,其中alternative子句的语句本身就是if语句

当然,IDE将“elseif”视为特殊的,这样您就可以获得预期的良好格式

请注意,“预处理器”语法中有一个
#elif
构造


注意到C、C++和ECMAScript——我确信更多的C类语言——也有没有正式的“否则if”语句的属性。相反,在每一个语句中,行为都不属于“else”的定义,因为它出现在单个语句之前。

除非在某些示例中使用它而不作解释,否则在该语句中从未提及构造
else if
。因此,我不认为它是一个特殊的构造,它只是嵌套的if语句。

要扩展@hunter的答案,原因是,如果没有括号,它将只执行下一行,如果它是一堆嵌套的,则else需要括号:

if(condition0) 
  statement0;
else
{
  if(condition1)
    statement1;
  else
  {
    if(condition2)
      statement2;
    else
    {
      if(condition3)
        statement3;
      else
      ...
    }
  }
}
C#语言规范的结尾仅显示
if
switch
语句。如果选择
If
语句,它会显示:

if语句根据布尔表达式的值选择要执行的语句

如果声明:

if(布尔表达式)嵌入语句

if(布尔表达式)嵌入语句else嵌入语句 布尔表达式: 表情

如果语法允许,else部分与词汇上最近的前置词相关联


你给出的两个例子在每种语言中都是等价的。在C或C#中,它完全等价于else,那么if。在其他一些语言中,elseif是else的语法糖,那么if。因此,无论您使用哪种语言,它们都将编译为相同的代码(或被解释为相同的行为)。请参阅

看起来像是一个很好的例子,用于
开关
:)在短时间内清除它。你说得对,但这似乎是一个有点令人眼花缭乱的争论,当它没有任何实际差异时:C C没有宏,比如C++,真是太糟糕了。我解决这个难题的典型方法是定义fandango-else if
,然后继续编写if-fandango-else语句。整个“elseif”问题被巧妙地避免了,代码的可读性也大大提高了。每个人都知道fandango语句,因为他们所要做的就是grep头文件以查找定义,以便读取与之关联的注释://fandango:替换“else if”构造。很明显,我喜欢有用的评论。请注意,如果。。。至少在某些编译器上,会导致大量嵌套的作用域。我知道在C++中,我用一个(几百个)其他IFS(笑话)程序来触发嵌套编译器错误。如果你使用了足够多的ifs来解决问题,你可能会遇到更大的问题。收益率中断。比如说,
foreach..in
是一个多词关键字,尽管有点中断。
yield return
将是一个多词语句关键字。正如foreach(…in…)一样,这取决于您对短语的理解程度。
yield return
不是单个关键字。它是一个上下文关键字,后跟所需的上下文关键字
return
break
;最后试着接球。请稍等。switch-case。通常,“else-if”被编译器/解释器视为两个独立的语句。带有“else-if”结构的语言通常只使用一个单词,如elseif或elif。反对票支持解释括号,这就是他所认为的情况?问题是else-if是嵌套的if-else结构,实际上不需要括号(并不是说如果他们真的用新行+缩进的风格写,他们就不会被鼓励).括号不是关于行,而是关于语句。在本例中,该语句是另一个if。完全同意,我更多的是说明他最初的想法哪里是错误的,如果他认为应该是我写的那样。它也没有列在关键字表中(第2.4.3节),这是构成关键字标记的正式定义。这对我来说已经足够了,但我要进一步说明:关键字被描述为“类似标识符的字符序列”;标识符规范不允许空白字符。因为“else if”至少包含一个空白字符,我想说它不是“一个类似标识符的字符序列”。@Wily博士:同样地,
yield return
根据规范不是一个关键字,但它仍然有意义。
if(condition0) 
  statement0;
else
{
  if(condition1)
    statement1;
  else
  {
    if(condition2)
      statement2;
    else
    {
      if(condition3)
        statement3;
      else
      ...
    }
  }
}