c - 优先级是否使 < 在 == 之前执行?

标签 c

对于以下代码:

int main()
{
    int a, b, c, d;
    c = 5;
    d = 5;
    a = 10;
    b = 8;
    if (a == c++ && b < d++);
    printf("c=%d d=%d\n", c, d);
    return 0;
}

输出:c=6 d=5

我知道,由于 if 语句中的第一个表达式的计算结果为 false,因此不计算第二个表达式,因此不计算输出。但是,我在 Balaguruswamy 的 ANSI C 中阅读了以下文字:

Since the operator < enjoys a higher priority compared to ==, b < d++ is evaluated first and then a == c++.

现在根据这个,d 的值不应该是成为6而不是 c

最佳答案

假设您在上下文中正确引用了这本书的文本是错误的。

a == c++ && b < d++ , 表达式被分组为 (a == c++) && (b < d++)由于语法规则。但是,事物分组的优先级并不能完全确定它们的求值顺序。1

优先级是一个编译时属性,它告诉我们表达式的结构。求值是一种运行时行为,它告诉我们表达式是如何计算的。


1 优先级部分决定了求值顺序,因为运算符的操作数必须在运算符被求值之前求值。例如,在 (a*b)+(c-d) 中, a*bc-d必须在 + 之前评估可以评估。这不是根据任何语法规则、优先级或关联规则,而仅仅是因为不可能计算出 + 的值。直到你知道它的操作数的值。但请注意,优先级并没有告诉我们 a*b 中的哪一个和 c-d首先评估,即使*优先级高于 - .

关于c - 优先级是否使 < 在 == 之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21606372/

相关文章:

c - scanf ("%d", &<变量>);返回 1

c - 过程声明和定义不匹配

c - 尝试创建一个处理 SIGUSR1 的程序,子进程应该执行另一个可执行文件

c - 如何使用c获取总线和开发信息

c - 可以通过将指针更改为更高的索引来缩小 C 中的数组吗?

c - C语言从右到左写字符串

关于如何结束 Execvp 调用的困惑

c - && 在 C 编程语言中的行为

c - 七大盗&钻石之谜C程序

c - Linux 内核中变量名后 *const* 的扭曲用法