#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么输出给出结果-2 2 0 1?
一个逻辑是(++ j && ++ k)不计算为++ i非零
但因为&&的优先级高于|| 为什么他们没有计算
优先级不指定计算表达式的顺序.它指定如何解释表达式.在这种情况下,C的优先规则(嵌入在其形式语法中)导致a || b && c被解释为a || (b && c).
在计算此表达式时,C的规则指定a必须首先计算.规则还声明如果a为true,则整个表达式的值为true,并且||不评估右侧的值.
为了更清楚地看到这一点,请考虑表达式a + b < c * d.优先规则会将其解释为(a + b) < (c * d).但是,与||C规则不同,不指定<必须首先评估左侧.编译器可以a + b先评估c * d,也可以先评估,即使*优先级高于+.允许编译器使用任何获得正确答案的评估顺序.
这里实行的唯一顺序是a + b和c * d在之前都必须进行评估<进行评估.但是,这来自表达式的结构,而不是优先级规则.
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |