for 循环中的一系列嵌套 if 语句是否统称为单个语句?
Are a series of nested if statements within a for loop collectively classified as a single statement?
考虑一段代码如下:
for (expr1a ; expr2a; expr3a)
if (expr 2a)
if (expr 3a)
if (expr 4a)
.
.
.
if (expr na)
statement_1;
编译器究竟是如何解释这个块的?总的来说,这是一个声明吗?或者,也许更具体地说,它是嵌入在一个语句中的一个语句,嵌入在一个语句中......等等。当我编译采用这种结构的代码时没有出现任何错误,因此我认为解释在某种程度上是正确的。
我问这个问题是因为在我的书 C Programming: A Modern Approach 中,for
语句被描述为具有以下形式:for (expr1 ; expr2 ; expr3) statement
- 注意 statement
的性质(即 不是 statements
)。
和 if
语句被描述为具有以下形式:if ( expr ) statement
- 注意 statement
.
的单数性质
不过,如果是这样的话,那我想象一下单数引入另一种说法(statement_2
)anywhere ,即使它是空语句 ;
也会立即改变解释。例如,如果我们有代码:
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;
这实际上现在解释为:
for (expr1a ; expr1b; expr1c)
if (expr2a)
if (expr3a)
statement_2;
if (expr4a)
if (expr5a)
statement_1;
这样对吗?
谢谢!
in my book C Programming: A Modern Approach, for statements are
described as having the form: for (expr1 ; expr2 ; expr3) statement -
note the singular nature of statement (i.e. not statements).
你可以这样写
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 );
互相关注。
考虑一段代码如下:
for (expr1a ; expr2a; expr3a)
if (expr 2a)
if (expr 3a)
if (expr 4a)
.
.
.
if (expr na)
statement_1;
编译器究竟是如何解释这个块的?总的来说,这是一个声明吗?或者,也许更具体地说,它是嵌入在一个语句中的一个语句,嵌入在一个语句中......等等。当我编译采用这种结构的代码时没有出现任何错误,因此我认为解释在某种程度上是正确的。
我问这个问题是因为在我的书 C Programming: A Modern Approach 中,for
语句被描述为具有以下形式:for (expr1 ; expr2 ; expr3) statement
- 注意 statement
的性质(即 不是 statements
)。
和 if
语句被描述为具有以下形式:if ( expr ) statement
- 注意 statement
.
不过,如果是这样的话,那我想象一下单数引入另一种说法(statement_2
)anywhere ,即使它是空语句 ;
也会立即改变解释。例如,如果我们有代码:
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;
这实际上现在解释为:
for (expr1a ; expr1b; expr1c)
if (expr2a)
if (expr3a)
statement_2;
if (expr4a)
if (expr5a)
statement_1;
这样对吗?
谢谢!
in my book C Programming: A Modern Approach, for statements are described as having the form: for (expr1 ; expr2 ; expr3) statement - note the singular nature of statement (i.e. not statements).
你可以这样写
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 );
互相关注。