
前面一篇已经对 if-else 语句、关系操作符、条件操作符详细的介绍了,不知各位能否熟练的掌握。接下来将对逻辑操作符、switch 语句、while 语句一一介绍,帮你打通条件判断与循环的任督二脉。
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符。
符号 | 名称 | 功能 |
|---|---|---|
! | 逻辑取反运算符 | 改变单个表达式的真假状态。如果表达式为真,则结果为假;如果表达式为假,则结果为真 |
&& | 逻辑与运算符 | 两侧的表达式都需要为真时,结果才为真。如果任何一个表达式为假,结果就为假 |
|| 逻辑或运算符 两侧的表达式中,只要有一个为真,结果就为真。只有当两个表达式都为假时,结果才为假
(由于文本编辑器问题,|| 占时只能那样写,还请见谅)
C/C++中,非0表示真,0表示假

! 是逻辑取反运算符,可以把假变为真,把真变为假。
比如,我们有一个变量叫 flag,如果 flag 为假的时候,就做某些事情,可以这样写代码:
#include <iostream>
using namespace std;
int main()
{
int flag = 0;//可以改为1试试
if (!flag)
{
cout << "do something" << endl;
}
return 0;
}演示结果:


如果 flag 为真,!flag 就是假,如果 flag 为假,!flag 就是真,所以上面的代码的意思就是 flag 为假,执行 if 语句中的代码。

&& 是与运算符,也是并且的意思,&& 是一个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
比如:如果3月到5月是春天该怎么表达呢?
int month = 0;
cin >> month;
if (month >= 3 && month <= 5)
{
cout << "春季" << endl;
}这里表达的意思就是month既要大于等于3,又要小于等于5,必须同时满足。

|| 就是或运算符,也就是或者的意思,|| 也是一个双目操作符,使用的方式是a || b,|| 两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说一年中月份是 12 月或者 1 月或者 2 月是冬天,那么我们怎么使用代码体现呢?
int month = 0;
cin >> month;
if (month == 12 || month == 1 || month == 2)
{
cout << "冬季" << endl;
}逻辑运算符还有一个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式就能确定整个表达式的结果,就不再对右边的表达式求值。这种情况称为短路。
如前面的代码:
if(month >= 3 && month <= 5)表达式中 && 的左操作数是 month >= 3,右操作数是 month <= 5 ,当左操作数 month >= 3 的结果是0的时候,即使不判断 month <= 5,整个表达式的结果也是 0(不是季)。
所以,对于 && 操作符来说,左边操作数的结果是 0 的时候,右边操作数就不再执行。对于 || 操作符是怎么样呢?我们结合前面的代码:
if(month == 12 || month == 1 || month == 2)如果month == 12,则不用再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。
所以,|| 操作符的左操作数的结果不为0时,就无需执行右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进行计算的运算称为短路求值。
由题目,我们只需保证四年一闰,百年不闰,四百年再闰就行,即年数对 4 和 400 取模为 0。对 100 取模不为 0。
代码如下:
//代码1
#include<iostream>
using namespace std;
int main()
{
int year = 0;
cin >> year;
if (year % 4 == 0 && year % 100 != 0)
cout << "1" << endl;
else if (year % 400 == 0)
cout << "1" << endl;
else
cout << "0" << endl;
return 0;
}
//代码2
#include <iostream>
using namespace std;
int main()
{
int year = 0;
cin >> year;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
cout << "1" << endl;
else
cout << "0" << endl;
return 0;
}只需要保证晶晶在 1、3、5 这三天不能接受邀请就行。
代码如下:
#include <iostream>
using namespace std;
int main()
{
int d = 0;
cin >> d;
if (d == 1 || d == 3 || d == 5)
cout << "NO" << endl;
else
cout << "YES" << endl;
return 0;
}演示效果:


判断三角形的一个特性就是:两边之和大于第三边。其中题目规定的取值范围未超过 int 型,故可以使用 int 型。
代码如下:
#include<iostream>
using namespace std;
int main()
{
int a, b, c;
cin >> a >> b >> c;
if(a + b > c && a + c > b && b + c > a)
cout << 1 << endl;
else
cout << 0 << endl;
return 0;
} 该题目可以先自己试一试,后面会讲。
除了 if-else 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是一种特殊形式的 if-else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
语法形式如下:
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。
注意:
例如:输入任意一个整数值,计算除3之后的余数
if-else 语句:
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
if (n % 3 == 0)
cout << "余数为0" << endl;
else if (n % 3 == 1)
cout << "余数是1" << endl;
else
cout << "余数是2" << endl;
return 0;
}switch语句:
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
switch (n % 3)
{
case 0:
cout << "余数为0" << endl;
case 1:
cout << "余数是1" << endl;
case 2:
cout << "余数是2" << endl;
}
return 0;
}
//这里代码,只是展示两种不同写法
//有一部分未写完,具体下面会详细的讲可以看到在某一方面 switch 语句可能比 if-else 语句表达简便些,但有时候可能恰恰相反,在之后的学习我们可以慢慢体会。
switch语句分支语句,在switch语句中,case语句决定了分支的入口,而break才是决定分支出口的,所以当一条case语句执行结束后,如果没有遇到break语句就会继续往下执行,而只有遇到break才会跳出switch语句。
就像上面的代码:
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
switch (n % 3)
{
case 0:
cout << "余数为0" << endl;
case 1:
cout << "余数是1" << endl;
case 2:
cout << "余数是2" << endl;
}
return 0;
}如果输入 2,演示结果:

发现没有什么问题,那么试一试输入 1 或 3 会什么样呢?演示结果如下:


我们会发现,不应该只打印一种情况,怎么会打印这么多。原因是没有跳出 switch 语句,根据上面代码的情况,我们应该在每个case语句执行完后,加上 break 语句。
代码如下:
#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
switch (n % 3)
{
case 0:
cout << "余数为0" << endl;
break;
case 1:
cout << "余数是1" << endl;
break;
case 2:
cout << "余数是2" << endl;
break;
}
return 0;
}演示结果:


发现输入正常了,并没有出现像最开始的那样什么都打印。
练习: 输入一个1~7的数字,打印对应的星期几 例如: 输入:1 输出:Monday 输入:2 输出:Tuesday 输入:3 输出:Wednesday 输入:4 输出:Thursday 输入:5 输出:Friday 输入:6 输出:Saturday 输入:7 输出:Sunday
参考代码如下:
#include<iostream>
using namespace std;
int main()
{
int day = 0;
cin >> day;
switch (day)
{
case 1:
cout << "Monday" << endl;
break;
case 2:
cout << "Tuesday" << endl;
break;
case 3:
cout << "Wednesday" << endl;
break;
case 4:
cout << "Thursday" << endl;
break;
case 5:
cout << "Friday" << endl;
break;
case 6:
cout << "Saturday" << endl;
break;
case 7:
cout << "Sunday" << endl;
break;
}
return 0;
}那是不是每一个 case 语句后面都要跟 break 呢?并不一定,如果给题目改一下的话
参考代码如下:
#include<iostream>
using namespace std;
int main()
{
int day = 0;
cin >> day;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
cout << "Workday" << endl;
break;
case 6:
case 7:
cout << "Weekend" << endl;
break;
}
return 0;
}上面的练习中,我们发现应该根据实际的情况,来在代码中觉得是否使用 break,或者在哪里使用 break,才能正确完成实际的需求。
在使用 switch 语句的时候,我们经常可能遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入 default 子句。
语法形式如下:
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}switch 后边的 expression 的结果不是 value1,也不是value2的时候,就会执 default 子句。
就比如前面做的打印星期的练习,如果 day 的输入不是1~7的值,如果我们要提示:input error!,表示输出错误。则可以这样完成代码:
#include<iostream>
using namespace std;
int main()
{
int day = 0;
cin >> day;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
cout << "Workday" << endl;
break;
case 6:
case 7:
cout << "Weekend" << endl;
break;
default:
cout << "input error!" << endl;
break;
}
return 0;
}演示结果:

在switch语句中case子句和default子句有要求顺序吗?default只能放在最后吗?
其实,在switch语句中case语句和default语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常是把default子句放在最后处理的。
这道题有一个难点就是:

想要保留后面两位数,我们可以一下都想到的方法就是取模,即 YYYYMM % 100 。代码如下:
#include <iostream>
using namespace std;
int main()
{
int n = 0, month = 0;
cin >> n; //一次性读取到的事6位整数
month = n % 100; //获取最低2位,就是月份
switch (month)
{
case 3:
case 4:
case 5:
cout << "spring" << endl;
break;
case 6:
case 7:
case 8:
cout << "summer" << endl;
break;
case 9:
case 10:
case 11:
cout << "autumn" << endl;
break;
case 12:
case 1:
case 2:
cout << "winter" << endl;
break;
}
return 0;
}那是否还有其他方法呢?那就是限定行数。
我们可以限定应该 %d 的指定宽度,代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int year = 0, month = 0;
scanf("%4d%2d", &year, &month);
switch (month)
{
case 3:
case 4:
case 5:
cout << "spring" << endl;
break;
case 6:
case 7:
case 8:
cout << "summer" << endl;
break;
case 9:
case 10:
case 11:
cout << "autumn" << endl;
break;
case 12:
case 1:
case 2:
cout << "winter" << endl;
break;
}
return 0;
} 这道题可以先自己试试,后面会一快讲。
C++ 中由三种循环 ,while 就是其中一种,接下来就介绍一下 while 语句。
while语句的语法结构和if语句非常相似,但不同的是while是用来实现循环的,if是无法实现循环的。
下面是while循环的语法形式:
//形式1
while(表达式) if(表达式)
语句; 语句;
//形式2
while(表达式) if(表达式)
{ {
语句 1; 语句 1;
语句 2; 语句 2;
... ...
} }
首先上来就是执行判断表达式,表达式的值为 0,循环直接结束;表达式的值不为 0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
**题目:**使用while循环在屏幕上打印1~10的值
参考代码:
#include <iostream>
using namespace std;
int main()
{
int i = 1;
while (i <= 10)
{
cout << i << " ";
i++;
}
return 0;
}演示效果:

想要得到 n 的最低位,可以使用 n % 10 的运算,得到的余数就是最低位。想要去掉 n 的最低位,找出倒数第二位,则使用 n = n / 10 操作。剩下的循环一直到为 0 跳出循环。
参考代码:
#include<iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
while(n)
{
cout << n % 10;
n /= 10;
}
return 0;
} 演示结果:

该题目与上面的题目是相似的,只不过是加起来了。
参考代码:
#include<iostream>
using namespace std;
int main()
{
int n = 0;
int sum = 0;
cin >> n;
while(n)
{
sum += n % 10;
n /= 10;
}
cout << sum << endl;
return 0;
} 非常简单的一道题,只需要将规定范围的数相加就行,但是要注意取值范围,题目限定 1~10^9 ,所以保险起见
参考代码:
#include<iostream>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int i = 1;
long long sum = 0;
while(i <= n)
{
sum += i;
i++;
}
cout << sum << endl;
return 0;
}这两道题先试一试手,后面会详细的讲解。
希望这篇文章能够更好的帮助勇闯算法的各位,更好的了解逻辑操作符、switch 语句、while 语句,为后面的循环嵌套做好准备。
同时愿诸君能一起共渡重重浪,终见缛彩遥分地,繁光远缀天。