问题描述
考虑一段如下编写的代码:
for (expr1a ; expr2a; expr3a)
if (expr 2a)
if (expr 3a)
if (expr 4a)
.
.
.
if (expr na)
statement_1;
编译器如何准确解释此块?总的来说,是一个陈述吗?或者,也许更具体地说,是将一条语句嵌入一条语句中,还是将一条语句嵌入...等。编译采用这种结构的代码时,我不会出错,因此我认为解释有些正确。
之所以问这个问题,是因为在我的《 C编程:一种现代方法》一书中,for
语句被描述为具有以下形式:for (expr1 ; expr2 ; expr3) statement
-注意单数的性质(即不是 statement
)。
statements
语句被描述为具有以下形式:if
-注意if ( expr ) statement
的单数性质。
但是,如果是这样的话,那么我会想象另一个语句(statement
)随处可见的单一介绍,即使它是空语句statement_2
立即更改解释。例如,如果我们有以下代码:
;
,然后将其更改为:
for (expr1a ; expr1b; expr1c)
if (expr2a)
if (expr3a)
if (expr4a)
if (expr5a)
statement_1;
这实际上现在解释为:
for (expr1a ; expr1b; expr1c)
if (expr2a)
if (expr3a)
statement_2; /* <------ */
if (expr4a)
if (expr5a)
statement_1;
这是对的吗
谢谢!
解决方法
在我的书《 C编程:一种现代方法》中,描述为具有以下形式:for(expr1; expr2; expr3)语句- 请注意声明(即不是声明)的单数性质。
您可以编写示例
for (expr1a ; expr2a; expr3a)
{
statements;
}
for循环具有一个复合语句。因此,带有一个语句的for语句的定义是正确的。
在此代码段中
for (expr1a ; expr2a; expr3a)
if (expr 2a)
if (expr 3a)
if (expr 4a)
.
.
.
if (expr na)
statement_1;
for循环只有一个语句
if (expr 2a)
反过来也有一个陈述
if (expr 3a)
以此类推。
此代码段
for (expr1a ; expr1b; expr1c)
if (expr2a)
if (expr3a)
statement_2; /* <------ */
if (expr4a)
if (expr5a)
statement_1;
等同于
for (expr1a ; expr1b; expr1c)
if (expr2a)
if (expr3a)
statement_2; /* <------ */
if (expr4a)
if (expr5a)
statement_1;
那是for循环只有一个语句
if (expr2a)
依次有一个陈述
if (expr3a)
这个if语句只有一个语句
statement_2; /* <------ */
for循环之后,还有另一个if语句
if (expr4a)
if (expr5a)
statement_1;
我将提供一个更有趣的结构。
通常,do-while语句的编写方式类似于
do
{
statement;
} while( condition );
此do-while语句包含一条语句-复合语句又包含一条语句。
但是您可以通过以下方式重写此do-while语句
do statement; while ( condition );
这是一个演示程序。
#include <stdio.h>
size_t count_digits( int n )
{
const int Base = 10;
size_t count = 0;
do ++count; while ( n /= Base );
return count;
}
int main(void)
{
int n = 12345;
printf( "The number %d contains %zu digits.\n",n,count_digits( n ) );
return 0;
}
其输出为
The number 12345 contains 5 digits.
当然,至少像这样写会更可读
do { ++count; } while ( n /= Base );
因为这个记录
do ++count; while ( n /= Base );
看起来像两个单独的语句
do ++count;
while ( n /= Base );
互相关注。