逻辑表达式的核心是 逻辑运算符。
逻辑运算符有三个:
①“||”,注意,没有双引号,意思是 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了。