为什么这是打破无限while
循环的有效代码行?
if (scanf("%s", word) != 1) break;
提到的break语句及其警戒是有效的,但它在说谎。考虑循环
while (1) {
...
}
根据结构化编程的规则,循环永远不应该退出,也就是说,除非程序退出。结构正确的程序应该使用功能scan的返回值作为循环保护,而不是使用break语句,如下所示:
tokenCount = scanf("%s", word);
while (tokenCount == 1) {
...
tokenCount = scanf("%s", word);
}
如果表达式没有副作用,则更容易推断程序的正确性;这就是为什么返回值存储在变量中(具有有意义的名称)的原因。
if (scanf("%s", word) != 1) break;
scanf
返回成功消耗的项目数。在下面的示例中,如果没有I / O错误发生并且由于仅消耗一项而成功转换了字符串,则该值为1
。
[我猜这个if
语句是循环的一部分,其意图是从输入中读取后续单词,直到遇到EOF
中的stdin
,因为条件才被评估为true
(并且如果发生EOF
或I/O
错误,因为在这种情况下scanf()
返回了0
,则发生中断。
尽管此表达式是有效的,但对于C语法,实际上它没有多大意义,因为scanf()
在大多数现代终端上将无限期地等待新输入,而不会在EOF
中寻找stdin
。
所以结果将是周围的循环变为无限,实际上永远不会终止。
printf()和scanf()的返回类型是整数。 prnitf()返回成功写入控制台的字符数,而scanf()返回成功读取的字符数