很抱歉,如果我的措辞不正确。
从高中开始,我就被教导要在有多行代码要执行的语句之后(例如,if,while,for等)添加花括号。示例:
while(i<12)
i++;
z = i+3;
cout << "Answer is " << z << endl;
将不会执行您期望的操作。但是以下内容将会:
while(i<12){
i++;
z = i+3;
cout << "Answer is " << z << endl;
}
但是我最近遇到了一个while循环,其中包含一个if..else语句,当看时看起来好像是多行代码/语句,但是无论它是否带有花括号,它都将按应有的方式执行和运行它的范围与否。
while(current != NULL && !found)
if(current->info >= newItem)
found = true;
else
{
trailCurrent = current;
current = current->link;
}
那是为什么?它将if..else语句视为单个语句吗?
答案 0 :(得分:12)
如果.. else是C ++中的单个语句(技术上称为selection statement)。根据{{3}},if
的有效形式为:
selection-statement: if constexpr-opt ( init-statement-opt condition ) statement if constexpr-opt ( init-statement-opt condition ) statement else statement
所以
while(current != NULL && !found)
if(current->info >= newItem)
found = true;
else
{
trailCurrent = current;
current = current->link;
}
也是单个语句,并且行为正确。
答案 1 :(得分:3)
if
的语法基本上是:
if (condition) statement else statement
如果您想用if
或else
分支来控制多个语句,则可以使用花括号将它们组合成一个块,这在语法上就是一个语句。
与while
,for
等类似。它们每个都控制一个语句,该语句可以是简单语句也可以是复合语句(即,使用花括号将一些语句组合在一起组成一个块)。
while (condition) statement
do statement while (condition)
for (for-init condition ; statement) statement
目前,我有点忽略了一些新近添加的内容,例如在循环头中定义变量,例如:for (int i...)
,因为这与手头的问题并不真正相关。
答案 2 :(得分:2)
selection-statement:
if (expression) statement
if (expression) statement else statement
switch (expression) statement
是的,if-else是一条语句。
这样想:如果if-else不是一个语句,那还会是什么? if
部分是一个语句,然后else
部分是另一个语句吗?如果是这种情况,您应该可以单独使用else
作为语句(没有前面的if
),但这没有任何意义。
答案 3 :(得分:1)
当然,它们是单个语句。没有else
,就不能写if
。如果while
循环与if-else
仅循环if
情况会怎样?您能想象else
将在循环完成后执行吗?
答案 4 :(得分:0)
是的,else
部分is part of the if
statement。这也是您可以编写else if (...)
的原因。 if
中的else if
形成第二条语句:第一个else
中if
部分的语句。
正如其他人已经在评论中指出的那样,依靠它会迅速导致难以阅读,混乱甚至错误的代码。例如:
if (a)
if (b)
; // ...
else
; // this is the else for if (b), not if (a)!
答案 5 :(得分:0)
是否将if..else语句视为单个语句?
是,
if(current->info >= newItem)
found = true;
else
{
trailCurrent = current;
current = current->link;
}
是一个陈述。
if
下的行是一个子语句。
else
下的代码块是子语句。
这是事实,无论它们是否在while
块下。