我无法在Python中生成显示布尔运算符优先规则与短路评估相结合的示例。我可以使用以下方法显示运算符优先级:
print(1 or 0 and 0) # Returns 1 because `or` is evaluated 2nd.
但当我把它改成这样时,短路的问题就显现出来了:
def yay(): print('yay'); return True
def nay(): print('nay')
def nope(): print('nope')
print(yay() or nay() and nope()) # Prints "yay\nTrue"
对于四种可能性中的每一种,当或
之前的表达式为true
时,它是唯一的求值表达式。如果运算符优先级有效,则应打印“nay\nnope\nyay\ntrue”
或“nay\nyay\ntrue”
(带有短路),因为和
应首先计算。
您混淆了运算符优先级和求值顺序。
表达式r=x或y和z
不被计算为tmp=y和z;r=x或tmp
,但正如r=x或(y和z)
。该表达式从左到右求值,如果或
的结果已经确定,则(y和z)
将完全不求值。
请注意,如果或
以及和
是函数,则会有所不同;在这种情况下,函数的参数将在调用函数本身之前求值。因此,operator.or_(yay(),operator.and_(nay(),nope()))
打印yay
、nay
和nope
,即它打印所有这三个,但仍然是从左到右的顺序。
您也可以将此推广到其他操作符。下面的两个表达式会由于运算符优先级的不同而产生不同的结果(使用(...)
,既有隐式的,也有显式的),但这两次都是从左到右调用函数。
>>> def f(x): print(x); return x
>>> f(1) + f(2) * f(3) / f(4) ** f(5) - f(6) # 1 2 3 4 5 6 -> -4.99
>>> (f(1) + f(2)) * (((f(3) / f(4)) ** f(5)) - f(6)) # 1 2 3 4 5 6 -> -17.29
如注释中所指出的,在操作之间的术语从左到右进行评估的同时,实际操作是根据它们的优先级进行评估的。
class F:
def __init__(self,x): self.x = x
def __add__(self, other): print(f"add({self},{other})"); return F(self.x+other.x)
def __mul__(self, other): print(f"mul({self},{other})"); return F(self.x*other.x)
def __pow__(self, other): print(f"pow({self},{other})"); return F(self.x**other.x)
def __repr__(self): return str(self.x)
def f(x): print(x); return F(x)
这样,表达式f(1)+f(2)**f(3)*f(4)
就被计算为1
,2
,3
,POW(2,3)
,4
,MUL(8,4)
,ADD(1,32)
,即项从左到右求值(并推送到堆栈上),表达式的参数一求值就被计算。
问题内容: 下面的两个语句是否等效? 和 我可以使用某种真值表来验证这一点吗? 问题答案: 优先于,因此,即使 与…不同 因为那将被执行为 并且想要使它们相同,是以下内容(使用括号覆盖优先级规则): 这是一个示例说明:
从高到低顺序如下: ^ not - (一元运算) * / + - ..(字符串连接) < > <= >= ~= == and or
通过前面的学习我们知道运算符有不同的类型,当这些不同类型的运算符出现在同一个表达式中时,就必须遵循运算符的优先级来进行运算,才能保证运算的合理性和结果的正确性、唯一性。运算符的优先级决定了表达式中各个部分执行运算的先后顺序。 下表中详细介绍了 C# 中运算符的优先级顺序: 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[整型表达式] 左到右 () 圆括号 (表
运算符的优先级决定了不同的运算符在表达式中计算的先后顺序,下表列出了 MySQL 中的各类运算符及其优先级。 优先级由低到高排列 运算符 1 =(赋值运算)、:= 2 II、OR 3 XOR 4 &&、AND 5 NOT 6 BETWEEN、CASE、WHEN、THEN、ELSE 7 =(比较运算)、<=>、>=、>、<=、<、<>、!=、 IS、LIKE、REGEXP、IN 8 | 9 & 10
所有的数学运算都认为是从左向右运算的, Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。 乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。 一般而言,单目运算符优先级较
主要内容:AND 运算符,语法,实例,OR 运算符,语法,实例SQLite 的 AND 和 OR 运算符用于编译多个条件来缩小在 SQLite 语句中所选的数据。这两个运算符被称为连接运算符。 这些运算符为同一个 SQLite 语句中不同的运算符之间的多个比较提供了可能。 AND 运算符 AND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在。使用 AND 运算符时,只有当所有条件都为真(true)时,整个条件为真(true)。例如,只