首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >if/else和if/else

if/else和if/else
EN

Stack Overflow用户
提问于 2009-03-12 10:12:05
回答 9查看 17.4K关注 0票数 6

如果我有一个像这样的语句块:

代码语言:javascript
复制
if (/*condition here*/){ }
else{ }

或者像这样:

代码语言:javascript
复制
if (/*condition here*/)
else if (/*condition here*/) {}
else if (/*condition here*/) {}

有什么关系?

似乎对于if/ else,if部分用于true状态,而else部分用于所有其他可能的选项(false)。else-if在许多情况下都很有用。这是我的理解,还有什么是我应该知道的吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-03-12 10:16:11

情况a:

代码语言:javascript
复制
if( condition )
{
}
else
{
}

当上述语句中的条件为false时,将始终执行else块中的语句。

情况b:

代码语言:javascript
复制
if( condition )
{
}
else if( condition2 )
{
}
else
{
}

当'condition‘为false时,else if块中的语句将仅在condition2为true时执行。当condition2为false时,将执行else块中的语句。

票数 15
EN

Stack Overflow用户

发布于 2009-03-12 10:17:36

如果没有“elseif if”语法,您将不得不编写链if语句来处理以下几种可能的结果之一:

代码语言:javascript
复制
if( str == "string1" ) {
   //handle first case
} else {
    if( str == "string2" ) {
       //handle second case
    } else {
       if( str == "string3" ) {
           //handle third case
       } else {
          //default case
       }
    }
 }

相反,您可以编写

代码语言:javascript
复制
if( str == "string1" ) {
   //handle first case
} else if( str == "string2" ) {
   //handle second case
} else if( str == "string3" ) {
   //handle third case
} else {
   //default case
}

它与前一个完全相同,但看起来更好,阅读起来也更容易。

票数 21
EN

Stack Overflow用户

发布于 2009-03-13 14:20:08

强调秋葵汤说的话。

此外,如果一种语言有一个真正的elif / elsif /else if (比方说,一个“真正的”else-if指令,而不是一种通过格式化隐藏起来的嵌套链接),那么编译器可以很容易地在抽象语法树(或类似的,参见http://en.wikipedia.org/wiki/Abstract_syntax_tree)中发出单个节点,而不是嵌套它们。

举个例子:

比方说在C/C++中,你有:

代码语言:javascript
复制
if (a) {
    X
} else if (b) {
    Y
} else if (c) {
    Z
} else {
    0
}

然后编译器将构建一个AST-node,如下所示:

代码语言:javascript
复制
   a
  / \
 X   b
    / \
   Y   c
      / \
     Z   0

但是如果选择的语言有一个真正的if-else:

代码语言:javascript
复制
if (a) {
    X
} elif (b) {
    Y
} elif (c) {
    Z
} else {
    0
}

那么AST可能更容易看起来像这样:

代码语言:javascript
复制
   (a--b--c)
   /  /  /  \
  X  Y  Z    0

在这样的语言中,只有在大括号不是强制性的情况下,"if else“才是可能的:

代码语言:javascript
复制
if (a) {
    X
} elif (b) {
    Y
} else if (c) {  // syntax error "missing braces" if braces mandatory
    Z
} else {
    0
}

对应的AST (如果大括号不是必需的):

代码语言:javascript
复制
   (a--b)
   /  /  \
  X  Y    c
         / \
        Z   0

这可以使CFG-Analysis (http://en.wikipedia.org/wiki/Control_flow_graph)更容易实现(尽管可能没有实际的优化好处;所以我看它只会让懒惰的程序员受益:D)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/637980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档