【问题标题】:Is the order of evaluation of AND operator from left to right guaranted? [duplicate]AND 运算符的求值顺序是否保证从左到右? [复制]
【发布时间】: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()) != EOFc != '\n' 之前被评估?

在我之前对 C 的了解中,关联顺序与求值顺序相同,并且 C 标准没有指定求值顺序。如果是这样,如果在 (c = getchar()) != EOF 之前评估 c != '\n' 会发生什么?因为getchar() 操作是在检查换行符之后完成的,所以它应该用前一个字符而不是当前读取的字符来检查换行符,对吧?

快速谷歌搜索表明这种代码是常见的,所以我怀疑如果我自己尝试它会起作用。该书还声称所有示例程序都是工作程序。

什么保证(c = getchar()) != EOFc != '\n'之前的评估?

【问题讨论】:

标签: c for-loop operators operator-precedence logical-and


【解决方案1】:

根据 C 标准(6.5.13 逻辑与运算符)

4 与按位二进制 & 运算符不同,&& 运算符保证 从左到右的评价;如果计算第二个操作数,则 是第一个和第二个评估之间的序列点 操作数。如果第一个操作数比较等于 0,则第二个操作数 未评估。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2022-01-13
    • 2014-03-17
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2011-08-06
    相关资源
    最近更新 更多