为什么 `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();
}
我能想到一些支持和反对的理由。
对于:
- 更短。
- 一切都在条件下完成。
- 不能忘记重写循环前和循环结束时的条件
循环。
反对:
- 令人困惑。
- 循环中的赋值(令人困惑?凌乱?)。
- 循环条件中可能未初始化的变量(它得到
分配,但这可能不会立即显而易见)。
- 比较和赋值被整齐地分开,保持
"one line, one task"第二种格式的心态。
- 每一次赋值都会有一次比较,所以复杂度
在这两种情况下都是一样的,因此更容易理解形式
应该是首选。
还有其他使用类似结构的示例吗?
我觉得这个问题会引起意见,所以我会要求他们有某种理由支持。粗略搜索发现这个问题没有重复,所以我希望它不是重复的!
您展示的代码很常见,因为它出现在开创性的 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先给它剥了皮
为什么是
while ((ch = getchar()) != EOF) {
// stuff
}
比以下更好common/preferred/considered?
ch = getchar();
while (ch != EOF) {
// stuff
ch = getchar();
}
我能想到一些支持和反对的理由。
对于:
- 更短。
- 一切都在条件下完成。
- 不能忘记重写循环前和循环结束时的条件 循环。
反对:
- 令人困惑。
- 循环中的赋值(令人困惑?凌乱?)。
- 循环条件中可能未初始化的变量(它得到 分配,但这可能不会立即显而易见)。
- 比较和赋值被整齐地分开,保持 "one line, one task"第二种格式的心态。
- 每一次赋值都会有一次比较,所以复杂度 在这两种情况下都是一样的,因此更容易理解形式 应该是首选。
还有其他使用类似结构的示例吗?
我觉得这个问题会引起意见,所以我会要求他们有某种理由支持。粗略搜索发现这个问题没有重复,所以我希望它不是重复的!
您展示的代码很常见,因为它出现在开创性的 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先给它剥了皮