【发布时间】:2010-09-25 02:17:21
【问题描述】:
我见过
for(;;)
和
for ( ; *s != '\0'; s++)
为什么它是空白的。谢谢。
【问题讨论】:
标签: c
我见过
for(;;)
和
for ( ; *s != '\0'; s++)
为什么它是空白的。谢谢。
【问题讨论】:
标签: c
for 语句的工作方式如下:
for (initialization; test-condition; update)
这三个中的任何一个或全部都可以省略(留空)。所以:
for (;;) 是一个无限循环1 等价于while (true),因为没有测试条件。事实上,for (int i=0; ;i++) 也将是一个无限循环1。
for ( ; *s != '\0'; s++) 是一个没有初始化的循环。 s 将指向(可能)字符串的开头并递增,直到到达表示字符串结尾的空字符 '\0'。这实质上意味着遍历字符串s的所有字符
1如果循环体中有break语句,或者对exit()的调用等,循环仍然会被中断......
【讨论】:
\0 是 NUL 字符。NUL 和 NULL 是不同的。
它是“那样的空白”,因为代码的作者将其留空。作者不想/不需要在for语句的相应部分做任何事情,所以留空。
for (;;) 是一个无限迭代的语句(除非它被循环体内部中断)。
for ( ; *s != '\0'; s++) 是一个不需要初始化部分的语句,因为所有必要的东西(如s 的初始值)都已经在for 语句之前初始化了。
【讨论】:
for(;;) 是一个无限循环。它实际上与while (true) 完全相同。
之所以如此,是因为当for 循环中的中间条件为空时,它被解释为始终为真。
for ( ; *s != '\0'; s++) 用于逐字符读取字符串。这种方法有效,因为每个 C 字符串都以空字符 (\0) 结尾。
【讨论】:
空白的部分基本上什么都不做。所以for (;;) 创建了一个什么都不做的无限循环,并且永远不会退出,因为循环中没有条件。你的第二个例子:
for ( ; *s != '\0'; s++)
只是一个没有任何初始化表达式的普通循环。这依赖于 s 已经有一个初始值并且只是循环直到它到达字符串末尾的事实。
【讨论】:
while(1) 和while(true) 与for(;;) 相同
【讨论】:
意思是永远做下去
for(初始条件;增量;结束条件);您可以省略其中任何一个
见http://en.wikipedia.org/wiki/For_loop
三个控制表达式, 这里用分号隔开,来自 从左到右初始化器 表达式,循环测试表达式, 和计数表达式。这 初始化器只计算一次 就在循环的开始。这 循环测试表达式在 每次迭代的开始 通过循环,并确定何时 循环应该退出。最后, 计数表达式在 每次循环迭代的结束 - 甚至 如果 continue 被调用 - 通常是 负责改变循环 变量。
在大多数提供此功能的语言中 for 循环的类型,三个中的每一个 控制循环表达式是可选的。 省略循环测试表达式时 被认为总是正确的,而 初始化器和计数表达式 省略时被视为无操作。 语法中的分号是 足以表明遗漏 表达式之一。
【讨论】: