相关阅读Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482在C语言和Python中比较运算符是一个常用的运算符但这两种语言在某些情况下对比较运算符的解析缺存在差异本文旨在明确这一点。Python中的比较运算符串联首先来看Python官方文档中对比较运算符的定义下面是定义的BNF范式。comparison :: or_expr (comp_operator or_expr)* comp_operator :: | | | | | ! | is [not] | [not] inBNF显示比较运算的构成是至少一个or_expr表达式和若干个comp_operator运算符、or_expr的组合本文我们可以简单地把or_expr表达式当做一个常数。其中comp_operator可以是下面三类中的符号。值比较小于()、大于()、等于()、大于等于()、小于等于()、不等于(!)标识号比较是(is)、不是(is not)成员检测在...内(in)、不在...内(not in)。本文只讨论值比较因为C没有标识号和成员检测比较符但结论适用于所有比较符。在编程中我们常常会需要比较三者之间的关系例如ABC又或者ABC...在Python中这很好实现因为Python将多个串联的比较运算符看作是两两组合并且通过“布尔与”运算符连接。比如在Python中表达式ABC几乎等价于AB and BC唯一的差别在于后一种写法中子表达式B会被求值两次而在第一种写法中子表达式B只会被求值一次注意在两种写法中当AB为真时C表达式不会再被求值这被称作逻辑短路。上面的描述也许不够直观下面来看几个例子加深理解。例1 print(543) Ture根据上面的解析规则例1所示的表达式被近似解析为图1所示的语法分析树。图1 语法分析树例2展示了表达式ABC和表达式AB and BC之间的细微差别为了体现求值顺序我们定义了三个函数函数内会打印信息并将其作为比较表达式的子表达式。例2 def func5(): print(This is 5) return 5 def func4(): print(This is 4) return 4 def func3(): print(This is 3) return 3 print(func5() func4() func3()) This is 5 This is 4 This is 3 True print(func5() func4() and func4() func3()) This is 5 This is 4 This is 4 #func4()被求值两次 This is 3 True该例不仅展示了func4()函数在两种表达式中的求值次数不同还侧面验证了之前的文章中说的Python的求值顺序是从左到右的CPython表达式的求值顺序evaluation order。下面的例3展示了比较运算符的逻辑短路性质需要注意的是这实际上是由“布尔与”运算符带来的性质。例3 def func5(): print(This is 5) return 5 def func4(): print(This is 4) return 4 def func3(): print(This is 3) return 3 print(func5() func4() func3()) This is 5 This is 4 #func3()不求值 False print(func5() func4() and func4() func3()) This is 5 This is 4 #func3()不求值 FalseC语言中的比较运算符串联在使用C语言中的比较运算符时需要更加谨慎图2是C11中比较运算符的语法。图2 C11中比较运算符的语法可以从图2中总结出比较运算表达式从左向右的结合性即一个比较表达式可以作为一个子表达式称为另一个比较表达式的左操作数而不是右操作数。举例来说表达式ABC在C语言中会被解析为子表达式A先与子表达式B比较比较结果再与子表达式C比较而这不是一般情况下我们想要的比较方式即A大于B大于C。下面我们来看一个例子具体说明上面的描述。例4 #include stdio.h int main() { printf(The result of expression is %d,543); } The result of expression is 0根据上面的解析规则例4所示的表达式被近似解析为图3所示的语法分析树。图3 语法分析树那么该如何实现A大于B大于C这种比较呢其实只用像Python一样直接显式使用“逻辑与”运算符连接多个比较表达式就可以了如例4所示。​例4 #include stdio.h int main() { printf(The result of expression is %d,54 43); } The result of expression is 1最后顺带一提C语言也和Python一样拥有逻辑短路性质即使之前的文章说过C语言不保证很多表达式的求值顺序但对于几个特殊的表达式规定了求值顺序其中就包含“逻辑与”运算符首先求值的左操作数再求值的右操作数并且拥有逻辑短路性质下面举例说明。例5 #include stdio.h int func5() { printf(This is 5\n); return 5; } int func4() { printf(This is 4\n); return 4; } int func3() { printf(This is 3\n); return 3; } int main() { printf(The result of expression is %d,func5()func4() func4()func3()); } This is 5 This is 4 //func3没有被求值 The result of expression is 0