首先分别明确一下他们各自的概念。
按位与和按位或
按位与和按位或都属于位操作符。
注意:位操作符的操作数必须是整数。
按位与“&”
按二进制位对应的位进行与运算,对应位都为1时,结果才为1
3&5
3的二进制: 00000000000000000000000011 //32位系统中
5的二进制: 00000000000000000000000101 //32位系统中
按位与的结果:00000000000000000000000001
代码验证
int main()
{
int a = 3;
int b = 5;
int c = a&b;
printf("%d\n", c);
return 0;
}
运行结果
按位或“|”
按二进制位对应的位进行或运算,对应位只要一个为1,结果就为1。
3|5
3的二进制: 00000000000000000000000011 //32位系统中
5的二进制: 00000000000000000000000101 //32位系统中
按位与的结果:00000000000000000000000111
代码验证
int main()
{
int a = 3;
int b = 5;
int c = a | b;
printf("%d\n", c);
return 0;
}
运行结果
逻辑与和逻辑或
逻辑与和逻辑或都是逻辑操作符。逻辑与和逻辑或关注的是操作符两边的表达式本身是真还是假。
C语言用整数1表示逻辑真,用0表示逻辑假。但在判断一个数据的真或假时,却以0和非0为根据:如果为0,则判定为逻辑假;如果为非0,则判定为逻辑真。
逻辑与“&&”
“&&”运算符两边的式子只有都是真,整个逻辑表达式的值才是真(即为1),否则整个逻辑表达式的值就是假(即为0)。
代码验证
int main()
{
int a = 3;
int b = 5;
int c = a && b;
printf("%d\n",c);
return 0;
}
运行结果
逻辑或“||”
“||”运算符两边的式子只要一个式子为真,整个逻辑表达式的值就是真(即为1),否则整个逻辑表达式的值就是假(即为0)。
代码验证
//一真一假
int main()
{
int a = 0;
int b = 5;
int c = a || b;
printf("%d\n",c);
return 0;
}
运行结果
//两个同时为假
int main()
{
int a = 0;
int b = 0;
int c = a || b;
printf("%d\n",c);
return 0;
}
运行结果
题目:程序输出的结果是什么?
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
printf(" a=%d\n b=%d\n c=%d\n d=%d\n",a ,b ,c ,d);
return 0;
}
运行结果
这里程序为什么输出的是这样一个结果呢?
逻辑与运算中操作符“&&”左边的式子只要为假(0)就不进行运算了。i = a++ && ++b && d++中。最左边的“a++”先参与运算后加加,a=0先参与逻辑或运算,因为操作符“&&”左边为0所以右边就停止计算。
逻辑与和按位与,逻辑或和按位或的区别
按位与和按位或是用二进制对应的位进行与和或运算,而逻辑与和逻辑或关注的是操作符两边的表达式本身是真还是假。
1&2----->0
1&&2---->1
1|2----->3
1||2---->1