如果我有一个像这样的语句块:
if (/*condition here*/){ }
else{ }或者像这样:
if (/*condition here*/)
else if (/*condition here*/) {}
else if (/*condition here*/) {}有什么关系?
似乎对于if/ else,if部分用于true状态,而else部分用于所有其他可能的选项(false)。else-if在许多情况下都很有用。这是我的理解,还有什么是我应该知道的吗?
发布于 2009-03-12 10:16:11
情况a:
if( condition )
{
}
else
{
}当上述语句中的条件为false时,将始终执行else块中的语句。
情况b:
if( condition )
{
}
else if( condition2 )
{
}
else
{
}当'condition‘为false时,else if块中的语句将仅在condition2为true时执行。当condition2为false时,将执行else块中的语句。
发布于 2009-03-12 10:17:36
如果没有“elseif if”语法,您将不得不编写链if语句来处理以下几种可能的结果之一:
if( str == "string1" ) {
//handle first case
} else {
if( str == "string2" ) {
//handle second case
} else {
if( str == "string3" ) {
//handle third case
} else {
//default case
}
}
}相反,您可以编写
if( str == "string1" ) {
//handle first case
} else if( str == "string2" ) {
//handle second case
} else if( str == "string3" ) {
//handle third case
} else {
//default case
}它与前一个完全相同,但看起来更好,阅读起来也更容易。
发布于 2009-03-13 14:20:08
强调秋葵汤说的话。
此外,如果一种语言有一个真正的elif / elsif /else if (比方说,一个“真正的”else-if指令,而不是一种通过格式化隐藏起来的嵌套链接),那么编译器可以很容易地在抽象语法树(或类似的,参见http://en.wikipedia.org/wiki/Abstract_syntax_tree)中发出单个节点,而不是嵌套它们。
举个例子:
比方说在C/C++中,你有:
if (a) {
X
} else if (b) {
Y
} else if (c) {
Z
} else {
0
}然后编译器将构建一个AST-node,如下所示:
a
/ \
X b
/ \
Y c
/ \
Z 0但是如果选择的语言有一个真正的if-else:
if (a) {
X
} elif (b) {
Y
} elif (c) {
Z
} else {
0
}那么AST可能更容易看起来像这样:
(a--b--c)
/ / / \
X Y Z 0在这样的语言中,只有在大括号不是强制性的情况下,"if else“才是可能的:
if (a) {
X
} elif (b) {
Y
} else if (c) { // syntax error "missing braces" if braces mandatory
Z
} else {
0
}对应的AST (如果大括号不是必需的):
(a--b)
/ / \
X Y c
/ \
Z 0这可以使CFG-Analysis (http://en.wikipedia.org/wiki/Control_flow_graph)更容易实现(尽管可能没有实际的优化好处;所以我看它只会让懒惰的程序员受益:D)。
https://stackoverflow.com/questions/637980
复制相似问题