if语句虽然让计算有了简单的判断能力,但是还远远谈不上有“智能”的程度。要想让计算变得更聪明,能够进行更深入的推理,就必须使用逻辑表达式和逻辑运算。要了解什么是逻辑表达式,首先要知道什么是bool(布尔)类型。
就像试卷中的判断题只有对和错一样,C++里的bool(布尔)类型只有两种值:true或者false。true也称为真(就像判断题的对), false称为假(就像判断题的错)。
在上一节中,我们在if语句中比较两个整数的大小,比较的结果就是bool类型的。比如:5>3这个表达式是成立的,也因此其结果是ture;而5<3是不成立的,结果为false。
整型常(变)量可以进行加、减、乘、除以及取余等计算。布尔类型的常(变)量也有自己的特定的运算,我们叫做布尔运算或逻辑运算:
1.逻辑与(&&)运算
“逻辑与”就像是我们说的“并且”的关系。只有当它两边的值都为 true 的时候,整个表达式的结果才是 true,其余情况的结果都是false。
假如你要去公园玩,条件是:天气好并且是周末。那么只有天气好(true)和是周末(true)的情况下你才能去公园玩(结果为 true);否则,你就不能去公园(结果为 false)。
例1.输入一个整数n,如果n是一个两位数则输出”Yes”,否则输出”No”。
n是两位数需要满足两个条件:第一个条件,n大于等于10;第二个条件,n小于100。这两个条件需要同时满足(逻辑与)。为什么呢?比如只满足第一个条件大于等于10的数可不一定是两位数。因为,1000就是大于等于10的数,但显然他不是一个两位数,反之亦然。参考代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n>=10 && n<100)
{
cout<<"Yes";
}
else
{
cout<<"No";
}
cout<<endl;
return 0;
}
2.逻辑或(||)运算
“逻辑或”就像是我们说的“或者”的关系。只有它两边的值都为false,整个表达式的结果才为false;否则,整个表达式的结果就是 true。
还是用去公园玩的例子,假如条件是:天气好或者是假期你就可以去公园。只有再既不是假期,天气也不好的情况下才不去公园玩(结果为 false),其余任何情况下都可以去公园(结果为 true)。
例2:输入一个整数n,如果能被3或5整除则输出”Yes”,否则输出”No”。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n%3==0 || n%5==0)
{
cout<<"Yes";
}
else
{
cout<<"No";
}
cout<<endl;
return 0;
}
3.逻辑非(!)运算
“逻辑非”运算其实是把bool类型的变量当做一个灯的开关:如果灯是开(true)着的,你按一下开关(逻辑非操作)灯就关(false)了;相反,如果等原来是关(false)着的,你按一下开关(逻辑非操作)灯就开(true)了。
关于逻辑运算的注意事项
1.逻辑运算符虽然只有3个,但是运算的优先级却天差地别。C++运算的优先级如下:
逻辑非 > 算数运算 > 关系运算 > 逻辑与 > 逻辑或
也就是说,逻辑表达式中如果有逻辑非先算逻辑非;算完逻辑非运算再进行逻辑与运算,最后进行逻辑或运算。
例3:输入一个四位年份,如果是闰年输出”Yes”,否则输出”No”。闰年可以分为两种,一种是普通闰年,就是公历年份是4的倍数,且不是100的倍数的,为普通闰年(如2004年、2020年等);另外一种是世纪闰年,即公历年份是400的倍数的(如1600年、2000年等)。参考代码如下:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int year;
cin >> year;
if ( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0 )
{
cout << "Yes";
}
else
{
cout << "No";
}
cout << endl;
return 0;
}
这里可以把判定条件中的括号去掉,写成:year % 4 == 0 && year % 100 != 0 || year % 400 == 0也是可以的。因为逻辑与的优先级高于逻辑或。但是更建议加上括号,这样更容易阅读。
2.逻辑值与数值的转换
为了把算数运算和逻辑运算都统一起来,C++做了如下的规定:数值转为布尔类型时,0可以被视为false,而任何非0值被视为true;相反,布尔转为数值时,true被视为1,而false被视为0。参考代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a = 0;
if(a)
{
cout<<"true"<<endl;
}
else
{
cout<<"false"<<endl;
}
return 0;
}