C 为什么编译器要按照下面代码中的优先规则编译?
根据,赋值运算符在其他运算符中的优先级最低(逗号之前) 但是,当我们执行下面的代码时,它会打印C 为什么编译器要按照下面代码中的优先规则编译?,c,C,根据,赋值运算符在其他运算符中的优先级最低(逗号之前) 但是,当我们执行下面的代码时,它会打印3 int main() { int a=10,b=6,c=7; if (b%=(a%=b) * c >= 3 * c-b) printf ("1"); else if (a ? b : c == 0) printf ("2"); else if (c = c || a&&b) printf ("
3
int main()
{
int a=10,b=6,c=7;
if (b%=(a%=b) * c >= 3 * c-b)
printf ("1");
else if (a ? b : c == 0)
printf ("2");
else if (c = c || a&&b)
printf ("3");
else if (!c || printf ("4"))
printf("4");
}
我要说的是,它应该打印1
,因为a%=b
将首先编译(因为它有括号),然后编译器将执行a*c
,最后它将与表达式(3*c-b)
进行比较,即3*7-6=15
。由于a*c=4*7=28
和28>=15
为真,因此输出为1
比方说,即使第一个if为假,为什么第二个if为假<由于第一个if
,a
是4
,b
现在是28
,编译器将返回三元数的“true”部分,即b
,因为b
不是0
;如果,则第二个为真
28>=15为真,则输出为1
是,然后b%=1
为0,因此if
为false
它是:
非常感谢,我意识到我在自相矛盾!评论不用于扩展讨论;这段对话已经结束。
b %= ((a%=b) * c >= 3 * c-b) =
... =
b %= 1 =
0