为什么if语句"AND"条件不需要加括号?

Why does if sentence "AND" condition does not need to be bracketed?

int num;
scanf("%d", &num);

if (num % 4 == 0 && num%100 != 0 || num % 400 == 0)
    printf("%d", 1);
else
    printf("%d", 0);

在这个逻辑中,我发现我不需要在OR条件前面的AND条件中做()if (*(num % 4 == 0 && num%100 != 0)* || num % 400 == 0)

只需要if (num % 4 == 0 && num%100 != 0 || num % 400 == 0)没有OR条件前面的()。 所以,似乎 (A && B || C)((A && B) || C) 一样工作 但它似乎可以作为 (A && (B || C)) 条件。

为什么在这种情况下不需要 ()? A、B条件从头开始自动分组?

C 中的所有运算符(实际上是所有语言)都具有所谓的运算符优先级,它规定首先对哪些操作数进行分组。

逻辑 AND 运算符 && 的优先级高于逻辑 OR 运算符 ||,这意味着:

A && B || C

与此相同:

(A && B) || C

所以如果要将B || C组合在一起,需要显式加上括号,即:

A && (B || C)

括号决定运算顺序,如果你移动括号,你可能会改变输出结果。同样,(A + B) / C 不同于 A + (B / C) 但仍然是一个有效的等式。

Order of Operations in C

逻辑 AND 的优先级高于 OR: https://en.cppreference.com/w/c/language/operator_precedence

dg