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
语句。我知道没有分隔符,
if
或else
中允许有一个语句。所以在这种情况下,我认为它相当于下面的代码。
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
不是一个关键字。它是一个上下文关键字,后跟所需的上下文关键字return
或break
;
试一试。做的时候。开关盒。【参考方案6】:
C# 语言规范的Selection Statement 仅显示if
和switch
语句。如果您选择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#