在一个表达式中,可以含有多个逻辑运算符,他们的优先级是:“!”最高“&&”次之“||”最低;逻辑运算低于所有关系运算,而“!”高于所有算术运算。

第一个例子

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	int a = 3;
	int b = 4;
	int c = 5;
	int d = 6;
	(a > b) && (c > d);
	a > b&& c > d;
}

这两个式子的值一样,都是为0;因为逻辑运算低于所有关系运算,()可以不加。

第二个例子

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	int a = 0;
	int b = 4;
	int c = 0;
	int d = 6;
	int e = (a || b) && (c || d);
	int f = a || b && c || d;
	printf("e=%d,f=%d",e,f);
}

这个式子尽管他们的答案一样,但是他们所表达的意思不一样,第一个式子优先算括号里面的,而第二个式子先算b&&c他们的结果是0;再计算a||0,其结果也是0,最后算0||d,答案也是1。

第三个例子

int a = 0;
	int b = 4;
	int c = 0;
	int d = 6;
 !a || a > b;

这个式子结果为1,首先是判断!a,其结果为1,再判断a>b其结果为0,然后就是||,得到答案1。

第四个例子

int main() {
	int a = 3;
	int b = 4;
	int c = 0;
	int d = 6;
	int e = a >= 10 && b && c++;
	int f = a >= 10 || b || c++;
	printf("e=%d,f=%d",e,f);
}

第四个例子有两个问题1.关于e,f的值以及c的值有没有变化。

首先因为关系运算大于逻辑运算,所以先是判断a>=10,又因为C语言规定若&&前面的值为0,则后面的操作不进行,虽然c++的优先级最高,但是a>=10的值为0,所以c++不进行运算,c的值不改变。e的值为0,c不改变。

f的值为1,首先是进行c++运算他的值为1,再||中只要一边为1,就确定了整个式子为1。c的值改变了,它的值为1。

第五个例子

int main() {
	int a = 3;
	int b = 4;
	int c = 0;
	int e = ++a || b && ++c;
	printf("e=%d,c=%d,a=%d",e,c,a);
}

第五个例子也是判断式子的值以及c的值有没有改变;

第五个式子其实与第四个一样,首先++a其值为1,||之后的操作就不再进行,式子的值为1,c的值没有改变。