在面试题64. 求1+2+…+n遇到了利用逻辑运算符(&&)的短路作用。由于答案多数是java或者c。python 中位运算符和逻辑运算符 平时用的不多。所以总结一下,以便更清晰的区分。
python中的位运算符 与 c/c++ 中的位运算符
Python位运算符 | 含义 | C/C++ | 区别 |
& | 按位与 | & | 无· |
| | 按位或 | | | 无 |
^ | 按位异或 | ^ | 无 |
~ | 按位非(有符号二进制数的补码形式) | ~ | 无 |
<< | 左移动运算符(*2的n次方) | << | 无 |
>> | 右移动运算符(/2的n次方) | >> | 无 |
在位运算符上两者都是相同的,不管输入的二进制(0b)、十进制、八进制(0o)还是十六进制(0x),首先应该转成二进制,然后在按照位运算进行运算,最后结果会返回二进制对应的十进制数。
python中的逻辑运算符 与 c/c++ 中的逻辑运算符
python | c/c++ | 含义 |
and | && | 布尔‘与’ |
or | || | 布尔‘或’ |
not | ! | 布尔‘非’ |
在 c/c++ 中的&& 和 || ,具有短路功能,就是 a && b,当 表达式a为False时,不再计算表达式b,直接返回False。即使b表达式是一个会报错的表达式也是可以的。
bool a = false;
int b = 13;
cout<< (a && b/0) <<endl ; // 0
在 python中 and 和 or,也具有短路功能。
表达式从左至右运算,若 or 的左侧逻辑值为 True ,则短路 or 后所有的表达式(不管是 and 还是 or),直接输出 or 左侧表达式 。
表达式从左至右运算,若 and 的左侧逻辑值为 False ,则短路其后所有 and 表达式,直到有 or 出现,输出 and 左侧表达式到 or 的左侧,参与接下来的逻辑运算。
若 or 的左侧为 False ,或者 and 的左侧为 True 则不能使用短路逻辑。
上面引用来自:https://www.cnblogs.com/an9wer/p/5475551.html 不理解的,可以看一下链接中的例子。
这个规则 c/c++ 也试用。仿照上面链接尝试了在c++中是否符合,发现这个规则对于c++也是试用的。下面是c++中的仿写例子。
例子1:在全部and时,短路后面的均不会执行(python同)。
#include<iostream>
#include<stdlib.h>
using namespace std;
int a(){
cout<<'A'<<endl;
return 0;}
int b(){
cout<<'B'<<endl;
return 0;}
int c(){
cout<<'c'<<endl;
return 1;}
int d(){
cout<<'d'<<endl;
return 0;}
int e(){
cout<<'e'<<endl;
return 1;}
int main()
{ if (a() and b() and c() and d() and e() ) cout<< 'ok'<<endl;
return 0;}
// output: A
例子2:
#include<iostream>
#include<stdlib.h>
using namespace std;
int a(){
cout<<'A'<<endl;
return 1;}
int b(){
cout<<'B'<<endl;
return 1;}
int c(){
cout<<'c'<<endl;
return 0;}
int d(){
cout<<'d'<<endl;
return 0;}
int e(){
cout<<'e'<<endl;
return 1;}
int main()
{ if (a() and b() and c() and d() and e() ) cout<< 'ok'<<endl;
return 0;}
// output:A B c
因为a() b () 是True,继续比较and,到c() 时为False,后面又全是and 所以从c() 处短路。
例子3:
#include<iostream>
#include<stdlib.h>
using namespace std;
int a(){
cout<<'A'<<endl;
return 1;}
int b(){
cout<<'B'<<endl;
return 0;}
int c(){
cout<<'c'<<endl;
return 1;}
int d(){
cout<<'d'<<endl;
return 0;}
int e(){
cout<<'e'<<endl;
return 1;}
int main()
{ if (a() or b() or c() or d() or e() ) cout<< "ok" <<endl;
return 0;}
// output: A ok
a() 的逻辑值为 True ,其后均为 or 语句,全部短路,最终只打印了 A,而 if 语句为 True ,所以还要打印一个 ok
例子4:
#include<iostream>
#include<stdlib.h>
using namespace std;
int a(){
cout<<'A'<<endl;
return 0;}
int b(){
cout<<'B'<<endl;
return 0;}
int c(){
cout<<'c'<<endl;
return 1;}
int d(){
cout<<'d'<<endl;
return 0;}
int e(){
cout<<'e'<<endl;
return 1;}
int main()
{ if (a() or b() or c() or d() or e() ) cout<< "ok" <<endl;
return 0;}
// output: A B c ok
python 从左至右先执行 a() ,a() 返回的逻辑值为 False,后面是 or 语句,所以不能短路其后,继续与 b() 进行逻辑运算,a() or b() 输出 b() 的逻辑值 False,接着与 c() 进行逻辑运算,b() or c() 输出 c() 的逻辑值 True,而其后为 or 语句, 则全部短路,最终只打印了 A B c ok。
例子5:(and 和 or 同时存在)
#include<iostream>
#include<stdlib.h>
using namespace std;
int a(){
cout<<'A'<<endl;
return 0;}
int b(){
cout<<'B'<<endl;
return 0;}
int c(){
cout<<'c'<<endl;
return 1;}
int d(){
cout<<'d'<<endl;
return 0;}
int e(){
cout<<'e'<<endl;
return 1;}
int f(){
cout<<'f'<<endl;
return 1;}
int g(){
cout<<'g'<<endl;
return 0;}
int h(){
cout<<'h'<<endl;
return 1;}
int main()
{ if ( a() and b() and c() and d() or e() and f() or g() and h() ) cout<< "ok" <<endl;
return 0;}
// output: A e f ok
从左至右,首先a() 的逻辑值为 False,其后到 or 语句为止有三个 and 语句: a() and b() and c() and d(),均被短路。只输出 a(), 得到 a() or e() 为True,输出 e() ,得 e() and F() 为 True ,输出 f(), 其后接 or 语句,则短路其后所有。最终只打印了A E F ok 。
区别:
(1)
c/c++ 当 and 左右都为True时,返回True。
python返回最后一变量值。
c/c++
int b = 13;
cout<< (b/2 && b/1) <<endl ; // 1
python
a = 10
print(a/2 and a/1) # 10.0
(2)
c/c++ 当多个变量中存在0,返回False。
python 多个变量中存在0,返回第一个为0的变量值。
bool a = false;
int b = 13;
cout<< (b/2 && a && 0 ) <<endl ; // 0
a,b = 10,0
print(a/2 and None and a/3 and b) # None
这个细节的注意提醒地方来自:Leetcode 题解。
可以理解成,当表达式全部为and时,发生短路现象,c++返回Flase,而python中返回了 产生False的表达式。
(3)
c/c++中 当 发生短路现象(全是or)时,返回 Fasle。
pyhton 当 发生短路现象(全是or)时,返回 or 左边的值。
bool a = false;
int b = 13;
cout<< (b/2 or a or b) <<endl ; // 1
a,b = 10,0
c = False
print(a/2 or b or a) # 5.0
(4)
c/c++ 中 若 or左边是True,它会继续判断后面的,直到能够能知道最终结果。
python 若 or左边是True(x is True),则会返回 右边(y) 的计算值。 (x or y )
bool a = false;
int b = 13;
cout<< (a or b/1 or a) <<endl ; // 1
a,b = 10,0
c = False
print(c or b or a/2) # 5.0
## x is c,c is False ,then y = b or a/2, b or a/2 return a/2, finally return 5.0
总的来说,就是不管表达式长什么样子,c/c++ 都只会返回 True/False。但是 python 会按照上面不同的情况,返回不一样的值。