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

时间:2016-06-15 05:06:41

标签: c loops idioms idiomatic

为什么

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

更常见/偏好/考虑比以下更好?

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

我可以想出一些支持和反对的理由。

有关:

  • 短。
  • 一切都在条件下完成。
  • 不能忘记在循环之前和结束时重写条件 循环。

反对:

  • 混乱。
  • 循环中的赋值(令人困惑?凌乱?)。
  • 循环条件中可能未初始化的变量(它得到 分配,但这可能不会立即明显)。
  • 比较和分配保持整齐分离,保持一个 第二种形式的“一线一任”心态。
  • 对于每个作业,都会有一个比较,所以复杂性 在两种情况下都是相同的,因此更容易理解形式 应该是首选。

是否有其他使用类似结构的例子?

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

1 个答案:

答案 0 :(得分:0)

您展示的代码很常见,因为它是在开创性的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首先剥了它。