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 );

互相关注。