11

for假设我想使用循环在 C 中打印五次消息。为什么如果我在 for 循环之后添加一个分号,如下所示:

for (i=0;i<5;i++);

消息没有打印 5 次,但是如果我不把分号放在那里,它会打印吗?

4

8 回答 8

29

分号是一个合法的语句,称为空语句 *,表示“什么都不做”。由于for循环执行单个操作(可能是包含在 中的块{}),因此分号被视为循环的主体,从而导致您观察到的行为。

以下代码

 for (i=0;i<5;i++);
 {
     printf("hello\n");
 }

解释如下:

  • 重复五次for (i=0;i<5;i++)
  • ...什么都不做(分号)
  • 为局部变量打开一个新范围{
  • ...打印“你好”
  • 关闭范围}

如您所见,重复的操作是;,而不是printf


*K&R,第 1.5.2 节

于 2012-11-16T17:24:22.003 回答
11
for (i=0;i<5;i++);

相当于

for (i=0;i<5;i++){}
于 2012-11-16T17:23:34.113 回答
3

;仅由标记组成的语句称为null 语句,它只是……什么都不做。

例如,这是有效的:

void foo(void)
{
     ;
     ;
     ;
} 

它可以在可以使用语句的任何地方使用,例如:

if (bla)
    ;
else
    ;

请参阅 C 标准段落:

(C99,6.8.3p3)“空语句(仅由分号组成)不执行任何操作。”

于 2012-11-16T17:37:07.223 回答
1

下面的代码将打印“Hello”5次..

    for(i=0;i<5,printf("Hello\n");i++);
于 2012-11-16T17:42:50.333 回答
0

当您在 for 循环后放置分号时,许多编译器会显示语法错误,但根据 gcc 编译器(Linux)或 Dev-cpp,您可以在 for 循环后放置分号,它不会显示任何错误。

例如

for(int i=0;i<=5;i++);

或者

for(int i=0;i<=5;i++) 
{//blank body}

从上面的示例中可以清楚地看出,如果我们在 for 循环之后放置空括号或分号,这意味着我们还没有输入任何变量。

现在来回答你的问题。
如果要打印 hello 5 次,则必须将程序编写为

for(int i=0;i<5;i++)
{
    printf("hello");
}

我希望你能理解
干杯!!
拉胡尔·瓦西斯

于 2016-09-16T16:24:00.167 回答
0

当 for 循环体仅包含单个语句时,则无需在 for 循环体{}周围使用花括号。

for(i=0; i<5; i++)
{
    printf("Napoleon");
    printf("Bonaparte");
}
      
for(j=0; j<5; j++)
    printf("Napoleon");

所以for(j=0; j<5; j++);将自己评估为

for(j=0; j<5; j++)
    ;

所以这是一个带有单个语句的 for 循环,它是;空语句。null 语句什么都不做。当循环运行 5 次时,null 语句执行 5 次,但它没有按照定义执行任何操作。

于 2021-12-25T04:02:31.890 回答
0
#include <stdio.h>
    
int main() {
    int sum = 0; // variable initialization  
    int k = 1;  
    //for(int i = 1; i <= 10; i++);
    {
        sum = sum + k;  
        k++;
    }  
    printf("The  value of sum is %d", sum);  
    return 0;
}

如果 for 循环后面有分号,则花括号中的代码将被视为常规主体,并将正常执行。

在上面的程序中,我已经对for循环进行了注释,它的作用与放在循环;末尾相同for。它打印总和,1因为花括号内的代码执行一次。

于 2021-05-29T16:32:27.497 回答
-1

它的功能与:

for(i=0;i<5;i++) {}

在这里,它在大括号内没有任何内容,只会将 i 的值增加到 5。 您可以使用下一行的 print 语句检查并获得 i=5。

`这里编译的代码ss!!!

于 2021-12-22T04:32:30.357 回答