逻辑表达式的核心是 逻辑运算符

 

逻辑运算符有三个:

①“||”,注意,没有双引号,意思是 or 。在||左右两边的表达式,只要有一个成立,那么这个逻辑表达式的值就是true。只有两个都不成立,才是false;

 

②“&&”,同样没有双引号,意思是 and。在&&左右两边的表达式,只要有至少一个不成立,就是false,只有两个都成立,才是true;

 

③“!”,没有双引号,意思是 not。例如,“==”是等于,而“!=”是不等于(not 等于)。

 

上代码:

#include<iostream>

int main()
{
	using namespace std;
	int a = 1;int b = 11;
	if (a > 1 || b > 12) { cout << "a > 1 || b > 12" << endl; }
	if (a > 1 || b > 10) { cout << "a > 1 || b > 10" << endl; }
	if (a > 0 || b > 12) { cout << "a > 0 || b > 12" << endl; }
	if (a > 0 || b > 10) { cout << "a > 0 || b > 10" << endl; }

	if (a > 1 && b > 12) { cout << "a > 1 && b > 12" << endl; }
	if (a > 1 && b > 10) { cout << "a > 1 && b > 10" << endl; }
	if (a > 0 && b > 12) { cout << "a > 0 && b > 12" << endl; }
	if (a > 0 && b > 10) { cout << "a > 0 && b > 10" << endl; }

	if (!(a > 1 && b > 12)) { cout << "!(a > 1 && b > 12)" << endl; }
	if (!(a > 1 && b > 10)) { cout << "!(a > 1 && b > 10)" << endl; }
	if (!(a > 0 && b > 12)) { cout << "!(a > 0 && b > 12)" << endl; }
	if (!(a > 0 && b > 10)) { cout << "!(a > 0 && b > 10)" << endl; }
	system("pause");
	return 0;

}



输出:



a > 1 || b > 10
a > 0 || b > 12
a > 0 || b > 10
a > 0 && b > 10
!(a > 1 && b > 12)
!(a > 1 && b > 10)
!(a > 0 && b > 12)
请按任意键继续. . .



结论:

①从代码中可以看出,在第一部分“||”的四个代码中,前3个至少有一个成立,于是输出了结果;

 

②在第二部分的“&&”四个代码中,只有最后一个两个都成立的,才输出了结果;

 

③在第三部分加了“!”的“&&”四个代码中,我们发现,原本不成立的,输出了结果,原本成立的,反而不能输出结果,这就是not作用。

 

 

 

小技巧:

①表示范围:用&&,

例如10<a<20,用a>10&&a<20;

也可以用于判断字符,代码:

#include<iostream>

int main()
{
	using namespace std;
	char a;
	cin >> a;
	if (a >= 'a'&&a <= 'z') { cout << "你输入的在a~z之间。"; }
	else if (a >= 'A'&&a <= 'Z') { cout << "你输入的在A~Z之间。"; }
	else if (a >= '0' && a <= '9') { cout << "你输入的是0~9之间的一个数。"; }	//之所以用'0',是因为数字0的ASCII值不是0
	else { cout << "恕我实在不知道你输入的是什么。" << endl; }
	system("pause");
	return 0;

}



当输入小写字母,则输出第一句;

输入大写字母,则输出第二句;

输入数字(注意,若代码中不是判断0~9,那么判断的是输入的第一个数字),则输出第三句;

输入其他,则输出第四句。

 

②若是输入大小写字母都可以,使用“||”,如代码:



#include<iostream>

int main()
{
	char a;

	for (int i = 1;i < 5;i++)
	{
		std::cout << "请输入你的性别:\nA.男\nB.女\n";
		std::cin >> a;
		if ('a' == a || 'A' == a) { std::cout << "你的性别是:男。"; }
		if ('b' == a || 'B' == a) { std::cout << "你的性别是:女。"; }
		std::cout << "\n\n";
	}

	system("pause");
	return 0;	
}



输出:



请输入你的性别:
A.男
B.女
a
你的性别是:男。

请输入你的性别:
A.男
B.女
A
你的性别是:男。

请输入你的性别:
A.男
B.女
b
你的性别是:女。

请输入你的性别:
A.男
B.女
B
你的性别是:女。

请按任意键继续. . .



循环4遍是为了测试四种输入都可以。假如输入除了a、b、A、B之外的,将无输出,自动进入下一遍循环。

 

 

③注意不要使用10<a<20;这样的语法,他的作用是先判断:

10<a=》假如a=11,那么10<a是真=》然后表达式值为1,值1的确小于20=》于是这个表达式值为true。

看起没问题,那么假如a=30,30显然不在10~20之间的范围内。

同样带入,方法相同,输出的还是true,肯定是不对的。

int

if (10 < i < 20) { cout << "10<i<20"<<endl; }

是能输出结果10<i<20的。

 

④代码,判断输入的值是否超出类型限定范围:

#include<iostream>
#include<climits>
using namespace std;
bool max(double);	//至少要用一个比int类型范围大的,因为测试的是int类型,假如比int类型范围小,那么无论如何,不可能出界了。
//bool类型是因为只需要返回结果是1或者0,也可以用int,然后在函数内部,return 1或者0.

int main()
{
	double b;	//同上面解释,要比int范围大,比如LL,但LL的问题是,输入的数值也可能超出他的范围,所以double相对靠谱点
	cout << "请输入一个数值:" ;
	cin >> b;
	for (;max(b) != 1;)	//
	{
		cin >> b;
	}
	cout << "你输入的数值符合要求,是:" << b << endl;
	system("pause");
	return 0;
}

bool max(double a)
{
	if (a<INT_MIN || a>INT_MAX)	//比最大大或者比最小小。返回值0(给main函数的for),要求继续输入
	{
		cout << "你输入的值过大或者过小了,请重新输入:" ;
		return 0;	//也可以返回false,但总之要上下呼应
	}
	else return 1;	//不满足,那么肯定就是在范围内了,让返回1,破for循环。
	//也可以用a>INT_MIN && a<INT_MAX 效果其实是一样的,调整返回值即可。
}



输出:

请输入一个数值:12345678911
你输入的值过大或者过小了,请重新输入:1234567891
你输入的数值符合要求,是:1.23457e+09
请按任意键继续. . .



效果看注释。原则是,输入后,判断一次,超范围,返回继续循环,不超范围,离开循环,执行下面的。

 

 

⑤运算符优先级:

“||”和“&&”的优先级,比较低,至少低于关系运算符,例如<、>、==等。

即:a<1 || a>5 表示的意思是a比1小或者比5大。

“&&”同“||”

 

但是“!”的优先级很高,超过关系运算符,也超过||和&&

例如:!a<1 || a>5 ,这行代码的意思不是!(a<1 || a>5),而是(!a)>1 || a>5,因为比如a是1,!a是false,比如a是0,则!a是true,

代码:



#include<iostream>
using namespace std;

int main()
{
	int a = -1;
	cout << "a = -1" << endl;
	if (a < 1 || a>5) { cout << "a < 1 || a>5" << endl; }	//实质上是 a<1 或 a>5
	if (!a < 1 || a>5) { cout << "!a < 1 || a>5" << endl; }	//实质上是 (!a)<1 ===也就是false <1,或 a>5,前者成立,返回是true
	if (!(a < 1 || a>5)) { cout << "!(!a < 1 || a>5)" << endl; }	//实质上是a<1或a>5,因为是true,所以输出false
	system("pause");
	return 0;
}



输出:

a = -1
a < 1 || a>5
!a < 1 || a>5
请按任意键继续. . .



注意:

假如!a:

如果a是0,被!认为是false,反转后是true(1);

如果a是1,被认为是true,反转后是false(0);

然后再计算!a< b:

假如b是2,那么无论如何,表达式结果true,

如果b是0,那么无论如何,表达式结果是false;

假如b是1,那么当a=1时,结果是true;a=0为false。

即!1<1是true,!0<1是false

 

 

⑥运算符的替代:

“||”可以用“or”替代;

“&&”可以用“and”替代;

“!”可以用“not”替代;

如代码:

#include<iostream>
#include<iso646.h>	//按照教程说明,只有c语言需要这个头文件,但是C++不需要啊。但实际上如果不加这个,会提示错误

int main()
{
	using namespace std;
	int a = 2;
	cout << "a = 2" << endl;
	if (a > 1 and a < 3) { cout << "a>1 and a<3" << endl; }
	if (a < 5 or a>10) { cout << "a < 5 or a>10" << endl; }
	if (not(a < 1 and a>3)) { cout << "not(a < 1 and a>3)" << endl; }
	system("pause");
	return 0;
}



输出:

a = 2
a>1 and a<3
a < 5 or a>10
not(a < 1 and a>3)
请按任意键继续. . .




奇怪之处:按照教程说,C++无需头文件,但是,若不加这个头文件,那么就无法正常使用and 、or和not了。