【发布时间】:2021-12-21 22:36:14
【问题描述】:
我正在研究 K&R “The C Programming Language”第 2 版书,在第 29 页的第 1.9 章字符数组中,有一个示例程序可以在读取一组行后打印出最长的行。在程序中,提供了一个示例 getline() 函数,在该函数中是一个 for 循环,用于读取字符并检查有效性,如果有效则将其添加到字符数组中。 for 循环给出为
for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
我的问题是:什么保证 (c = getchar()) != EOF 在 c != '\n' 之前被评估?
在我之前对 C 的了解中,关联顺序与求值顺序不相同,并且 C 标准没有指定求值顺序。如果是这样,如果在 (c = getchar()) != EOF 之前评估 c != '\n' 会发生什么?因为getchar() 操作是在检查换行符之后完成的,所以它应该用前一个字符而不是当前读取的字符来检查换行符,对吧?
快速谷歌搜索表明这种代码是常见的,所以我怀疑如果我自己尝试它会起作用。该书还声称所有示例程序都是工作程序。
什么保证(c = getchar()) != EOF在c != '\n'之前的评估?
【问题讨论】:
-
@Jabberwocky 运算符优先级和关联性与它没有任何关系。 What is the difference between operator precedence and order of evaluation?
-
@Lundin 我愚蠢地将关联性与评估顺序混为一谈。我删除了这个愚蠢的评论,包括这个,谢谢。
标签: c for-loop operators operator-precedence logical-and