if (2<3 || 3<4 && 5>6) printf("OK");
else printf("FAIL");
我对计算机将如何评估此if语句感到困惑。我的猜测是(因为&&在||之前(:
if ((2<3 || 3<4) && 5>6) printf("OK");
else printf("FAIL");
由于语句是错误的,if 应该打印 FAIL。但答卷上写着答案没问题。 我的问题是,当遇到这种情况时,我应该从左到右评估还是从&&开始?
测试自己。当结果已知时,C 不会计算所有表达式 https://godbolt.org/z/dE4y3M , https://godbolt.org/z/E_sxhX
#include <stdio.h>
int first(int x)
{
printf("FIRSTn");
return x;
}
int second(int x)
{
printf("SECONDn");
return x;
}
int third(int x)
{
printf("thirdn");
return x;
}
int fourth(int x)
{
printf("fourthn");
return x;
}
int main()
{
if(first(0) || second(0) && third(1) || fourth(1)) printf("TRUEn");
else printf("FALSEn");
}
逻辑和 (&&( 高于逻辑或 (||(,并且从左到右计算。
看到这里。
if (2<3 || 3<4 && 5>6) printf("OK");
else printf("FAIL");
和...
if ((2<3) || ((3<4) && (5>6))) printf("OK");
else printf("FAIL");
如果您检查运算符优先级表,您会发现&&
的优先级高于||
。 它还表明<
和>
的优先级高于它们。
这意味着此表达式:
if (2<3 || 3<4 && 5>6)
将被解析为:
if ((2<3) || ((3<4) && (5>6)))
因此,最高优先级运算符的操作数首先分组,然后分组下一个最高运算符。 在处理优先级相等的运算符时,一些分组从左到右,而另一些组从右到左。
但是,最好始终在这些运算符周围使用括号,以使读者清楚地了解您的意图。
逻辑 AND 运算符的优先级高于逻辑 OR 运算符。所以 if 语句中的表达式
if (2<3 || 3<4 && 5>6) printf("OK");
等效于以下表达式
if ( 2<3 || ( 3<4 && 5>6 ) ) printf("OK");
这两个运算符都是从左到右计算的。
对于逻辑 OR 运算符">如果第一个操作数比较不等于 0,则不计算第二个操作数。(C 标准(
因此,当逻辑 OR 运算符的第一个操作数2 < 3
产生 true,则整个表达式的结果不等于 0 并计算为 true(其值为整数 1(。