按哪个顺序是 && 和 ||用 C 评估?


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(。

相关内容

  • 没有找到相关文章

最新更新