Python 和 C++ 中的 位运算符和逻辑运算符 区别与联系

面试题64. 求1+2+…+n遇到了利用逻辑运算符(&&)的短路作用。由于答案多数是java或者c。python 中位运算符和逻辑运算符 平时用的不多。所以总结一下,以便更清晰的区分。

python中的位运算符 与 c/c++ 中的位运算符

Python位运算符含义C/C++区别
&按位&无·
|按位|
^按位异或^
~按位非(有符号二进制数的补码形式~
<<左移动运算符(*2的n次方)<<
>>右移动运算符(/2的n次方)>>

在位运算符上两者都是相同的,不管输入的二进制(0b)、十进制、八进制(0o)还是十六进制(0x),首先应该转成二进制,然后在按照位运算进行运算,最后结果会返回二进制对应的十进制数。

python中的逻辑运算符 与 c/c++ 中的逻辑运算符

pythonc/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 会按照上面不同的情况,返回不一样的值。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Foneone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值