【发布时间】:2012-11-05 11:05:22
【问题描述】:
假设我想使用 for 循环在 C 语言中打印五次消息。为什么如果我像这样在 for 循环之后添加分号:
for (i=0;i<5;i++);
消息没有被打印 5 次,但如果我不把分号放在那里,它会打印?
【问题讨论】:
假设我想使用 for 循环在 C 语言中打印五次消息。为什么如果我像这样在 for 循环之后添加分号:
for (i=0;i<5;i++);
消息没有被打印 5 次,但如果我不把分号放在那里,它会打印?
【问题讨论】:
分号是一个合法的语句,称为 null 语句 *,意思是“什么都不做”。由于for 循环执行单个操作(可能是包含在{} 中的块),因此分号被视为循环的主体,从而导致您观察到的行为。
以下代码
for (i=0;i<5;i++);
{
printf("hello\n");
}
解释如下:
for (i=0;i<5;i++)
{打开一个新范围
}
如您所见,重复的操作是;,而不是printf。
【讨论】:
{} 是什么都不做的首选方式。
for (i=0;i<5;i++);
等价于
for (i=0;i<5;i++){}
【讨论】:
仅由 ; 标记组成的语句称为 null 语句,它只是……什么都不做。
例如,这是有效的:
void foo(void)
{
;
;
;
}
它可以在任何可以使用语句的地方使用,例如:
if (bla)
;
else
;
参见 C 标准段落:
(C99, 6.8.3p3) "空语句(仅由分号组成)不执行任何操作。"
【讨论】:
下面的代码将打印“Hello”5次..
for(i=0;i<5,printf("Hello\n");i++);
【讨论】:
i < 5, printf("Hello\n");,并且逗号运算符评估其 LHS (i < 5) 并忽略结果,然后评估 RHS (printf("Hello\n")),它返回 6,因为它将 6 个字符写入标准输出;因为 6 为真(它不为零),所以循环无限期地继续。使用 GCC 的默认编译器选项(包括 -Werror),代码无法编译:error: left-hand operand of comma expression has no effect [-Werror=unused-value]。
当您在 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");
}
希望你能理解
干杯!!
拉胡尔·瓦希斯特
【讨论】:
#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,因为花括号内的代码执行一次。
【讨论】:
当 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 次,但它没有按照定义执行任何操作。
【讨论】:
它的功能与:
for(i=0;i
这里大括号内没有任何内容,只会将 i 的值增加到 5。 您可以在下一行使用 print 语句检查这一点并得到 i=5。
【讨论】: