来自初级 C 程序员的问题:
if (exp)
doX;
else
doY;
分号是语句分隔符,那么我很困惑 if .. else 或嵌套 if.. else 被称为单语句?
在 C 语言中,有些语句包含其他语句——这些语句不以分号结尾。if
语句是一个选择语句,它可以包含一个或两个语句(这又可能是复合语句——包含任意数量的语句的大括号块),而它本身是一个语句。一个if
语句被认为是一个单一的语句,因为它可以放置在一个语句可能出现的任何地方。
考虑表达式:1
是一个表达式,但 so is1+1
和 so is (1+(1+1)*(1-1))/1*(1%1)
... 这是一个表达式,包含其他表达式。
或者想想政治分歧。例如,美国是一个政治部门,但它包含州,这些州是政治部门,而州包含县,其中包含城市……所有政治部门。
编辑:关于您在评论中提出的问题......没有“其他声明”。相反,一个if
语句有一个可选的 else 部分:
if (condition) statement1 [else statement2]
您示例中的分号终止内部语句;if
整个语句结束时不需要分号。例如,
if (exp)
{ do1(); do2(); do3(); } // statement1
else
{ do4(); do5(); } // statement2
// no semicolon ending if statement
这里,statement1 和 statement2 是块,它们不以分号结尾,就像if
整个语句不以分号结尾一样。
针对以下问题进行编辑:单个语句的确切定义在 C 标准中给出,并且非常复杂,因为它几乎涉及整个 C 语法......我试图给出一个更概念性的概述。语句是程序的可执行组件,没有值(与表达式相反,表达式有值)。通常,语句是以分号结尾的非复合语句,例如
x = 5;
或者
return;
...或者它们是不以分号结尾的复合语句,尽管如果它们的最后一个组成部分有,它们可能会出现,例如,
while (1)
do_something();
或者
while (1) {
do_something();
}
显然,这些分号都没有结束 while 语句,它们结束了内部语句。
分号终止子句中处理的if()
语句,而不是if
它本身。如果你使用大括号,它看起来像这样:
if(1)
{
do_true_branch(); <== ';' terminates the statement
}
else
{
do_false_branch(); <== ';' terminates the statement
}
如果你只有一个语句,你可以省略大括号,但 ';' 声明仍然需要。
两者if
都else
只会找到下一条语句,包括一个块。
首先,块是一个语句:
C11 6.8 语句和块
块允许将一组声明和语句组合成一个语法单元。具有自动存储持续时间的对象的初始化器和具有块范围的普通标识符的可变长度数组声明器在每次声明时被评估并将值存储在对象中(包括在没有初始化器的对象中存储不确定的值)按执行顺序到达,就好像它是一个语句,并且在每个声明中按照声明符出现的顺序。
现在让我们看看 C 是如何使用块的概念定义选择语句(即if
&else
和语句)的:switch
C11 6.8.4 选择语句
选择语句是一个块,其范围是其封闭块范围的严格子集。每个关联的子语句也是一个块,其范围是选择语句范围的严格子集。
这是因为您可以省略{}
提供 if 块或 else 块只有一个语句。
因此,C 语言的人称这个成语为 if 单语句。
if(condition)
{
...
...
}
可以放置在像 int x = 5; 这样的语句的地方。可以放置。没有 if 就不能出现 else。因此,它一起称为单个语句。
如果您从 C 开始,请尝试忘记它是可能的并选择:
if (exp) {
doX;
} else {
doY;
}
只是为了避免你将来犯很多错误。
人们问:为什么这回答了这个问题?
它以一种出现大量错误的方式回答它,因为对于大多数 C 程序员来说,答案似乎是显而易见的。以下错误不属于理论性质。
if(exp) dox; doy;
或者
if(exp)
dox;
doy;
或者
if(exp) dox;
doy;
代码。那不是理论上的。因此,我建议自己尽可能多地插入 {},以避免出现此类错误。以后很难找到它们。