为什么这是一个有效的scanf语句来打破while循环?

为什么这是一个有效的scanf语句来打破while循环?,c,if-statement,while-loop,scanf,C,If Statement,While Loop,Scanf,为什么这是一个有效的代码行来打破无限的循环,而循环 if (scanf("%s", word) != 1) break; 上面提到的break语句及其守卫是有效的,但它在撒谎。考虑循环 while (1) { ... } 根据结构化编程的规则,循环不应该退出,也就是说,除非程序退出。结构正确的程序应该使用函数扫描的返回值作为循环保护,而不是使用break语句,如下所示: tokenCount = scanf("%s", word); while (tokenCount == 1) {

为什么这是一个有效的代码行来打破无限的
循环,而
循环

if (scanf("%s", word) != 1) break;

上面提到的break语句及其守卫是有效的,但它在撒谎。考虑循环

while (1) {
   ...
}
根据结构化编程的规则,循环不应该退出,也就是说,除非程序退出。结构正确的程序应该使用函数扫描的返回值作为循环保护,而不是使用break语句,如下所示:

tokenCount = scanf("%s", word);
while (tokenCount == 1) {
    ...
    tokenCount = scanf("%s", word);
}

如果表达式没有副作用,也更容易推断程序的正确性;这就是返回值存储在变量中(具有有意义的名称)的原因。

前面提到的break语句及其保护是有效的,但它是假的。考虑循环

while (1) {
   ...
}
根据结构化编程的规则,循环不应该退出,也就是说,除非程序退出。结构正确的程序应该使用函数扫描的返回值作为循环保护,而不是使用break语句,如下所示:

tokenCount = scanf("%s", word);
while (tokenCount == 1) {
    ...
    tokenCount = scanf("%s", word);
}
如果表达式没有副作用,也更容易推断程序的正确性;这就是返回值存储在变量(具有有意义的名称)中的原因

scanf
返回成功消费的项目数。此值用作表达式内的左操作数。因此,这个表达式是完全有效的

在下面的示例中,如果没有发生I/O错误,并且由于只有一个项目要使用,字符串已成功转换,则该值应为
1

我猜这个
if
语句是循环的一部分,它的目的是从输入中读取后续单词,直到遇到
stdin
EOF
状态或任何用作输入的重定向文件,因为条件只有在那时才被计算为
true
(并以此打破周围的循环)如果出现
EOF
或另一个
I/O
错误,则在这种情况下
scanf()
返回
0

这将使您了解如何评估和解释该
if
语句

scanf
返回成功消费的项目数。此值用作表达式内的左操作数。因此,这个表达式是完全有效的

在下面的示例中,如果没有发生I/O错误,并且由于只有一个项目要使用,字符串已成功转换,则该值应为
1

我猜这个
if
语句是循环的一部分,它的目的是从输入中读取后续单词,直到遇到
stdin
EOF
状态或任何用作输入的重定向文件,因为条件只有在那时才被计算为
true
(并以此打破周围的循环)如果出现
EOF
或另一个
I/O
错误,则在这种情况下
scanf()
返回
0


这将使您了解如何评估和解释该
if
语句

scanf
返回什么?scanf
返回什么?有些人(包括我自己)更喜欢带有
break
语句的无止境循环,而不是带有显式结束条件的“适当”循环。这使得在开发的早期阶段更容易移动代码。另外,如果为了避免无休止的循环而不得不在循环之外重复部分代码,那就特别难看了。由于重复相同的代码两次,你的建议更糟糕@这是一个正确的观点。然而,在我看来,收益大于成本。scan语句并不复杂。有些人(包括我自己)更喜欢带有
break
语句的无止境循环,而不是带有显式结束条件的“适当”循环。这使得在开发的早期阶段更容易移动代码。另外,如果为了避免无休止的循环而不得不在循环之外重复部分代码,那就特别难看了。由于重复相同的代码两次,你的建议更糟糕@这是一个正确的观点。然而,在我看来,收益大于成本。扫描语句并不复杂。EOF是带外发生的事情。如果流中没有遇到EOF,则流可能会进入EOF状态或其他错误state@M.M现在好多了?我从来没有认真考虑过。我的想法是,
FILE
EOF
直接插入流中。嗯,我还得多读一点。也谢谢你。EOF是在乐队外发生的事情。如果流中没有遇到EOF,则流可能会进入EOF状态或其他错误state@M.M现在好多了?我从来没有认真考虑过。我的想法是,
FILE
EOF
直接插入流中。嗯,我还得多读一点。也谢谢你。