for循环中的一系列嵌套if语句是否被集体归类为单个语句?

问题描述

考虑一段如下编写的代码

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

互相关注。