为什么 `while ((ch = getchar()) != EOF)` 是常见的习语?

Why is `while ((ch = getchar()) != EOF)` the common idiom?

为什么是

while ((ch = getchar()) != EOF) {
   // stuff
}

比以下更好common/preferred/considered?

ch = getchar();
while (ch != EOF) {
    // stuff
    ch = getchar();
}

我能想到一些支持和反对的理由。

对于:

反对:

还有其他使用类似结构的示例吗?

我觉得这个问题会引起意见,所以我会要求他们有某种理由支持。粗略搜索发现这个问题没有重复,所以我希望它不是重复的!

您展示的代码很常见,因为它出现在开创性的 K&R C 书中。你可以在这里看到一个新手程序员被它迷惑的例子:reading k&r(c book) and confusing 1st chapter code

我个人的喜好要么是那样,要么是这样:

for (int ch = getchar(); ch != EOF; ch = getchar())

或者这样:

for (int ch; (ch = getchar()) != EOF; )

给猫剥皮的方法有很多种。但是K&R先给它剥了皮