"if else"被视为单个语句吗?

Is "if else" treated as a single statement?

本文关键字:语句 单个 if else      更新时间:2023-10-16

如果我的措辞错误,请道歉。

我从高中开始就被教导在语句(如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;
}

但是,我最近遇到了一个包含 if..else 语句在查看时似乎不止一行代码/语句,但它执行并按应有的方式工作,无论它的范围是否有大括号。

while(current != NULL && !found)
if(current->info >= newItem)
found = true;
else
{
trailCurrent = current;
current = current->link;
}

为什么?它是否治疗如果..否则语句作为单个语句?

如果 .. else 是 C++ 中的单个语句(技术上称为选择语句(。 根据 [stmt.select]/1,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;
}

也是单个语句,并且行为正确。

if的语法基本上是:

if (condition) statement else statement

如果要使用ifelse腿控制多个语句,请使用大括号将它们组合到一个块中,这在语法上是单个语句。

whilefor等也是如此。它们中的每一个都控制一个语句,该语句可以是简单语句,也可以是复合语句(即,使用大括号组合成一个块的若干语句(。

while (condition) statement
do statement while (condition)
for (for-init condition ; statement) statement

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

从 C11 标准:

selection-statement:
if (expression) statement
if (expression) statement else statement
switch (expression) statement

所以是的,if-else 是一个单一的陈述。

可以这样想:如果 if-else 不是一个单一的陈述,那还会是什么?if部分会是一个陈述,然后else是另一个陈述吗?如果是这种情况,您应该能够单独使用else作为语句(没有前面的if(,但这毫无意义。

是的,else部分是if语句的一部分。这也是你可以写else if (...)的原因。else if中的if形成第二个语句:第一个ifelse部分的语句。

正如其他人已经在评论中指出的那样,依赖这一点会很快导致代码难以阅读、混乱甚至错误。例如:

if (a)
if (b)
; // ...
else
; // this is the else for if (b), not if (a)!

当然,它们是单一的语句。没有if就无法编写else。如果while循环if-else循环仅在if情况下会怎样?你能想象循环完成后else会被执行吗?

它是否处理 if..否则语句作为单个语句?

是的

if(current->info >= newItem)
found = true;
else
{
trailCurrent = current;
current = current->link;
}

是一个声明。

if下面的行是一个子语句。

else下的代码块是子语句。

无论它们是否处于while块之下,都是如此。