C# 中是不是存在 if 语句?

Posted

技术标签:

【中文标题】C# 中是不是存在 if 语句?【英文标题】:Do else if statements exist in C#?C# 中是否存在 if 语句? 【发布时间】:2010-07-30 19:57:19 【问题描述】:

我在 C# 中遇到过以下代码。

if(condition0) statement0;
else if(condition1) statement1;
else if(condition2) statement2;
else if(condition3) statement3;
...
else if(conditionN) statementN;
else lastStatement;

我的一些同事告诉我这是else if 声明。但是,我确信它实际上是一个多层嵌套的if-else 语句。我知道没有分隔符ifelse 中允许有一个语句。所以在这种情况下,我认为它相当于下面的代码。

if(condition0) 
  statement0;
else
  if(condition1)
    statement1;
  else
    if(condition2)
      statement2;
    else
      if(condition3)
        statement3;
      else
      ...

请注意,我更改的只是空格。 此缩进有效,因为当没有分隔符时,每个 else 都会返回到最近的 if 语句。

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

【问题讨论】:

看起来是switch 的好案例:) Language spec 在短时间内清除它。你是对的,但是当它根本没有任何实际区别时,这似乎有点像一个肚脐凝视的论点:) 可惜C#没有C++这样的宏;我对这个困境的典型解决方案是执行#define fandango else if,然后我继续编写我的 if-fandango-else 语句。巧妙地避免了“else-if”的整个问题,并且代码更具可读性。每个人都知道 fandango 语句,因为他们所要做的就是 grep 头文件以找到定义,以便阅读我与之关联的注释:“// fandango:替换“else if”构造”。很明显,我只关心有用的 cmets。 请注意,if-else-if-else-if-else-if... 会导致严重嵌套的范围,至少在某些编译器上是这样。我知道在 C++ 中,我设法用一个有几百个 else-if 的(笑话)程序触发了嵌套编译器错误。如果您使用了足够多的 else-if 来遇到问题,那么您可能会遇到更大的问题。 【参考方案1】:

你是对的; C# 中没有“else if”语句这样的东西。它只是一个 else,其中替代子句的语句本身就是一个 if 语句。

当然,IDE 将“else if”视为特殊的,以便您获得所需的良好格式。

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

还要注意,C、C++ 和 ECMAScript——我相信还有更多类似 C 的语言——也具有没有正式的“else if”语句的特性。相反,在每个行为中,行为都超出了“else”的定义,即出现在单个语句之前。

【讨论】:

【参考方案2】:

这是一个多层if-else。

原因与 c# 语法规则有关。 else 后跟一个语句,任何if 链都可以作为语句。

【讨论】:

【参考方案3】:

C# specification 中从未提及构造 else if,除非在某些示例中不加解释地使用它。所以我不认为它是一个特殊的构造,它只是嵌套的 if 语句。

【讨论】:

它也没有列在关键字表(第 2.4.3 节)中,这是对什么构成关键字标记的正式定义。这对我来说已经足够了,但更进一步:关键字被描述为“类似标识符的字符序列”;标识符规范不允许空白字符。由于“else if”至少包含一个空白字符,我会说它不是“类似标识符的字符序列”。 @Dr.威利:在很大程度上,yield return 根据规范不是关键字。但它仍然有意义。【参考方案4】:

你是对的。它只是一个else,后跟一个if

【讨论】:

【参考方案5】:

C# 中没有“else if”语句。

关于那件事,我不知道C#中有any多词语句关键字。

【讨论】:

收益回报。屈服中断。 嗯,据说foreach..in 是一个多字关键字,虽然有点分了。 yield return 将是一个多字语句关键字。 foreach (... in ...) 也一样,这取决于你想对这个短语的解释有多松散。 yield return 不是一个关键字。它是一个上下文关键字,后跟所需的上下文关键字returnbreak 试一试。做的时候。开关盒。【参考方案6】:

C# 语言规范的Selection Statement 仅显示ifswitch 语句。如果您选择if 语句,它会显示:

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

if 语句:

if ( boolean-expression ) 嵌入语句

if ( boolean-expression ) 嵌入语句 else 嵌入语句 布尔表达式: 表达

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

【讨论】:

【参考方案7】:

您给出的两个示例在每种语言中都是等效的。在 C 或 C# 中,它完全等同于 else, then if。在其他一些语言中,elseif 是 else, then if 的语法糖。因此,无论您使用哪种语言,它们都将编译为相同的代码(或被解释为相同的行为)。见http://en.wikipedia.org/wiki/Conditional_%28programming%29#Else_If

【讨论】:

一般来说,“else if”被编译器/解释器视为两个单独的语句。具有“else if”结构的语言通常使用单个词,例如 elseif 或 elif。【参考方案8】:

为了扩展@hunter 的答案的原因,当你点击它时,没有括号它只会执行下一行,如果它是一堆嵌套的 else 将需要括号:

if(condition0) 
  statement0;
else

  if(condition1)
    statement1;
  else
  
    if(condition2)
      statement2;
    else
    
      if(condition3)
        statement3;
      else
      ...
    
  

【讨论】:

对解释括号投反对票,这是他认为发生的事情? 问题是 else-if is 是一个嵌套的 if-else 结构,并且您实际上并不需要括号(并不是说如果实际编写它们就不会被鼓励换行+缩进样式)。括号不是关于,而是关于语句。在这种情况下,该语句是另一个 if 完全同意,我更多的是说明他最初的想法在哪里不正确,如果是他认为的那样,我写的应该是这样。

以上是关于C# 中是不是存在 if 语句?的主要内容,如果未能解决你的问题,请参考以下文章

文件存在,如果语句检查,如果文件不存在,则不会返回正确的输出,C#

在C#中使用SQL语句查询数据在表中是不是存在输出是或否

我可以将 for 循环集成到检查数组中是不是存在数字的 if 语句中吗?

sql语句 判断表是不是存在

C#中怎么判断一个数组中是不是存在某个数组值

在C#中如何判断一个文件是不是存在?请各位告知下,越详细越好。