赞
踩
and
or
&&
||
Python中的逻辑运算符的运算结果既可以是布尔值,也可以是其他数据类型的值,这取决于运算符两侧操作数的类型。 补充:0或空值就是假值,非0或非空为真值;
然而,C语言基本数据类型中并没有bool类型(新标准或许有引入),逻辑运算符的结果是一个整数,真为1,假为0,不能为其他类型。
and
运算将返回左侧操作数。类似于短路机制。# 左侧为假值,返回左侧操作数 # 整数 a = 0 b = 5 ret = a and b print(f"ret={ret},类型是{type(ret)}") # 字符串 a = "" b = "Hello" ret = a and b print(f"ret={ret},类型是{type(ret)}") # 布尔值 a = False b = True ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合1 a = None b = "你干嘛~哎哟!" ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合2 a = [] b = "你干嘛~哎哟!" ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合3 a = () b = "你干嘛~哎哟!" ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合4 a = {} b = "你干嘛~哎哟!" ret = a and b print(f"ret={ret},类型是{type(ret)}")
运行结果:
and
运算将返回右侧操作数。# 整数 a = "你干嘛~" b = 20 ret = a and b print(f"ret={ret},类型是{type(ret)}") # 字符串 a = "Hello" b = "你干嘛~" ret = a and b print(f"ret={ret},类型是{type(ret)}") # 布尔值 a = "你干嘛~" b = True ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合1 a = "你干嘛~哎哟!" b = None ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合2 a = "你干嘛~哎哟!" b = [1, 2, 3] ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合3 a = True b = ("你干嘛~", "哎哟!") ret = a and b print(f"ret={ret},类型是{type(ret)}") # 混合4 a = 6176 b = {"詹姆斯": 23, "库里": 30} ret = a and b print(f"ret={ret},类型是{type(ret)}")
运行结果:
C语言中的逻辑"与"的现象
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int ret = 0; //结果 // 整数 int a = 0, b = 5; ret = a && b; printf("ret = %d\n", ret); // 字符串 char str1[] = ""; char str2[] = "你干嘛~"; ret = str1 && str2; printf("ret = %d\n", ret); // 数组 int arr1[] = {0}; int arr2[] = { 1,2,3 }; ret = arr1 && arr2; printf("ret = %d\n", ret); // 指针 int *p1 = NULL; int* p2 = &a; ret = p1 && p2; printf("ret = %d\n", ret); return 0; }
运行结果:
从C语言的运行结果来看,C语言的空字符串作为逻辑左表达式的逻辑值不是假,字面量只有0
和空指针NULL
在C语言中才是假,其余都是真,负数也是真。而且C语言没有空数组,只有默认初始化一个0的数组。
C语言中的"与"短路
int main() { int ret = 0; int a = 0, b = 10; printf("\"与\"前:a=%d, b=%d\n", a, b); ret = a++ && b++; printf("\"与\"后:a=%d, b=%d\n",a , b); if (ret) { puts("结果为真"); } else { puts("结果为假"); } return 0; }
运行结果:
由于短路操作b++
并没有被执行,结果还是a自增前的值0,所以直接作为假来执行了。
or
运算将返回左侧操作数。类似于短路机制。# 整数 a = "你干嘛~" b = 20 ret = a or b print(f"ret={ret},类型是{type(ret)}") # 字符串 a = "Hello" b = "你干嘛~" ret = a or b print(f"ret={ret},类型是{type(ret)}") # 布尔值 a = "你干嘛~" b = True ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合1 a = "你干嘛~哎哟!" b = None ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合2 a = "你干嘛~哎哟!" b = [1, 2, 3] ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合3 a = True b = ("你干嘛~", "哎哟!") ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合4 a = 6176 b = {"詹姆斯": 23, "库里": 30} ret = a or b print(f"ret={ret},类型是{type(ret)}")
运行结果:
or
运算将返回右侧操作数。# 整数 a = 0 b = 5 ret = a or b print(f"ret={ret},类型是{type(ret)}") # 字符串 a = "" b = "Hello" ret = a or b print(f"ret={ret},类型是{type(ret)}") # 布尔值 a = False b = True ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合1 a = None b = "你干嘛~哎哟!" ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合2 a = [] b = "你干嘛~哎哟!" ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合3 a = () b = "你干嘛~哎哟!" ret = a or b print(f"ret={ret},类型是{type(ret)}") # 混合4 a = {} b = "你干嘛~哎哟!" ret = a or b print(f"ret={ret},类型是{type(ret)}")
运行结果:
C语言的"或"短路
int main() { int ret = 0; int a = 10086, b = 1; printf("\"或\"前:a=%d,b=%d\n", a, b); ret = a-- || b--; printf("\"或\"后:a=%d,b=%d\n", a, b); if (ret) { puts("结果为真"); } else { puts("结果为假"); } return 0; }
运行结果:
道理同"与"短路,不再赘述;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。