我的任务是找到一个逻辑表达式,当且仅当给定的数字n
是2019
的倍数并且不是来自区间(a, b)
时,该表达式才会导致1
。
教科书给出了以下答案,我不太明白:
a>=n || b<=n && (n%3==0 && n%673==0)
我理解的那些偏执之间的事情等同于n%2019==0
,所以没关系。但我不明白为什么会这样,我的意思是&&
运算符比||
运算符具有更高的优先级,所以我们不会评估
b<=n && (n%3==0 && n%673==0)
如果n<=a
,则首先且仅在最后?我想,如果我要这样做,我会这样做:
(a>=n || b<=n) && (n%3==0 && n%673==0)
所以我只是添加了那套额外的参数。现在我们将检查数字是否不在区间(a, b)
,然后我们将检查它是否是2019
的倍数,然后我们将"和"这些答案以获得最终答案。这对我来说是有道理的。但我不明白为什么他们省略了那组参数,为什么这仍然有效?我们不应该认为&&
的优先级高于||
,所以我们添加了一组额外的参数吗?它还有效吗?还是我错了?
尝试一下表明,没有额外括号的表达式不起作用:
bool expr(int n, int a, int b)
{
return a>=n || b<=n && (n%3==0 && n%673==0);
}
例如,expr(1000, 2000, 2018)
的评估结果为true
,即使它不是2019年的倍数。
正如你所指出的,逻辑 AND 运算符 && 的优先级高于逻辑 OR 运算符 ||(引用(,因此表达式等效于:
a>=n || (b<=n && (n%3==0 && n%673==0))
n <= a
时总是如此,即使它不是 2019 年的倍数。
更清晰的表达方式是:
(n % 2019 == 0) && (n <= a || n >= b)