是否将“ if else”视为一个语句?

时间:2018-09-04 18:42:36

标签: c++

很抱歉,如果我的措辞不正确。

从高中开始,我就被教导要在有多行代码要执行的语句之后(例如,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语句视为单个语句吗?

6 个答案:

答案 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

如果您想用ifelse分支来控制多个语句,则可以使用花括号将它们组合成一个块,这在语法上就是一个语句。

whilefor等类似。它们每个都控制一个语句,该语句可以是简单语句也可以是复合语句(即,使用花括号将一些语句组合在一起组成一个块)。

while (condition) statement

do statement while (condition)

for (for-init condition ; statement) statement

目前,我有点忽略了一些新近添加的内容,例如在循环头中定义变量,例如:for (int i...),因为这与手头的问题并不真正相关。

答案 2 :(得分:2)

From the C11 standard

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形成第二条语句:第一个elseif部分的语句。

正如其他人已经在评论中指出的那样,依靠它会迅速导致难以阅读,混乱甚至错误的代码。例如:

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块下。