写在前面:大家好!我是【AI 菌】,一枚爱弹吉他的程序员。我
热爱AI、热爱分享、热爱开源
! 这博客是我对学习的一点总结与记录。如果您也对深度学习、机器视觉、算法、Python、C++
感兴趣,可以关注我的动态,我们一起学习,一起进步~
我的博客地址为:【AI 菌】的博客
上一篇:【C++养成计划】运算符&运算符优先级(Day4)
昨天,我们学习了C++常用的运算符以及运算符的优先级顺序,从而能够灵活地处理和变换各种数据了。今天我们主要来学习控制程序流程的两大方法:判断和循环。
文章目录
1. 判断
(1) if … else 语句
首先我们思考一下什么需要判断语句?想想在现实生活中,我们会根据不同的情形,经过判断后再去执行不同的操作。那么当我们用C++去解决一个问题的时候,也会遇到这种情况。举一个数学中很简单的例子,有一个分段函数:
这是一个典型需要判断语句的例子。当我们想去求y时,得首先判断x>0是否为真。当条件为真时,我们令y=1;否则,令y=0。那么用if … else语句实现如下:
if(x>0)
y=1; //如果x大于0
else
y=0; //如果x小于或等于0
由此,我们就对if…else判断语句有了一个简单的了解。那么下面,我们来了解在实际编程中一些必要的技能吧!
1.最基本的if...else结构
if(判断条件)
执行1;
else
执行2;
2.当要执行多条语句时,需要用{}将多条语句包含视为一个语句块。
(注意:初学者很容易犯的一个错是,没有加{},这样编译器会默认只执行1)
if(判断条件)
{
执行1;
执行2;
}
else
执行3;
3.可以不加else。这种情况下,判断条件为真,则执行1和2,否则直接跳出判断语句
if(判断条件)
{
执行1;
执行2;
}
4.很重要也是很容易被忽略的一点:判断条件只要不为0(即false),就视为真true
(2) 嵌套 if 语句
说起嵌套,让我想到最形象的一个例子是:俄罗斯套娃(它是一种木制娃娃玩具,当你打开外面的娃娃,会发现里面套着一个更小的娃娃,再打开里面的娃娃,里面还有更小更小的娃娃…)
if语句也是可以嵌套的,在外面的if语句里面,可以嵌套一个if语句。当然,里面的if语句也可以再嵌套。理论上,可以无穷嵌套下去。下面我们以嵌套一次为例:
if(判断条件1)
{
执行1;
if(判断条件2)
执行2;
else
执行3;
}
else
执行4;
(3) 多分支 if 语句
多分支if语句和if…else语句相似。只不过多分支语句对条件分的更细,所以它会有三个或者3个以上的分支,以下面的分段函数为例:
我们用C++对它实现如下:
if(x>0)
y=1;
else if (x==0) //注意这个地方要用==,而不是赋值符号=
y=0;
else
y=-1;
(4) switch-case条件处理
在有些问题中,虽然需要进行多次判断选择,但是每一次都是判断同一表达式的值,这样就没有必要在每一个嵌套的if语句中都计算一遍表达式的值,为此C++中提供了switch语句专门来解决这类问题。switch语句的语法形式如下:
switch(表达式)
{
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
...
case 常量表达式n:语句n;break;
default:语句n+1;break;
}
switch语句的执行顺序是:首先计算switch语句中表达式的值,然后在case语句中寻找值相等的常量表达式,并以此为入口执行相应的语句。如果没有找到相等的常量表达式,则从default开始执行。
使用switch语句需要注意的问题:
- switch语句后面的表达式可以是整型、字符型、枚举型
- 每个常量表达式的值不能相同,但是次序不影响执行结果。
- 每个case分支可以有多条语句,但不必用{}
- 每个case语句只是一个入口标号,并不能确定执行的终止点,因此每个case分支最后应该加上break语句,用来结束整个switch结构。否则会从入口端开始一直执行到switch结构的结束端。
下面举一个例子,指出输入的数字(1-7之间)对应星期几:
#include<iostream>
using namespace std;
int main()
{
enum DaysOfWeek //枚举常量
{
Monday=1,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
int day=0;
cout<<"请输入今天星期几(1-7):";
cin>>day;
switch(day)
{
case Monday: cout<<"Today is Monday!"; break;
case Tuesday: cout<<"Today is Tuesday!"; break;
case Wednesday: cout<<"Today is Wednesday!"; break;
case Thursday: cout<<"Today is Thursday!"; break;
case Friday: cout<<"Today is Friday!"; break;
case Saturday: cout<<"Today is Saturday!"; break;
case Sunday: cout<<"Today is Sunday!"; break;
default: cout<<"输入错误,请输入1-7之间的整数"; break;
}
return 0;
}
这里我从键盘输入2,程序输出结果如下:
程序中定义DaysOfWeek用到了枚举常量,对其还不太了解的同学,可以参见我前面的博客:【C++养成计划】深入浅出——变量作用域(Day3)
(5) 使用运算符?: 条件处理
C++提供了一个有趣且功能强大的运算符——条件运算符,它相当于紧凑的if-else结构。条件运算符也叫三目运算符,因此它使用三个操作数。
下面举一个简单的例子,用运算符?:来获得两个数的较大者:
int Max = (num1>num2)? num1:num2; //判断表达式num1>num2。如果为真,将num1传给Max,否则将num2传给Max
等效于如下if…else语句:
int Max=0;
if(num1>num2)
Max=num1;
else
Max=num2;
想了解更多有关运算符的知识,可以戳戳这里:【C++养成计划】运算符&运算符优先级(Day4)
2. 循环
(1) while循环
while循环的语法形式:
while(表达式)
{
循环体;
}
执行顺序是:先判断表达式的值,若为真true,则继续执行循环体语句。
下面举一个简单的例子,求自然数1至100的和。
#include<iostream>
using namespace std;
int main()
{
int i=1,sum=0;
while(i<=100)
{
sum+=i;
i++;
}
cout<<"sum="<<sum<<endl;
return 0;
}
运行结果如下:
(2) do … while 循环
do … while的语法形式:
do{
循环体;
}while(表达式);
执行顺序是:先执行循环体语句,后判断循环条件表达式的值。表达式为true时,继续执行循环体;否则结束循环。
同样,如果要求自然数1至100的和,也可以使用do … while结构,如下所示:
#include<iostream>
using namespace std;
int main()
{
int i=1,sum=0;
do{
sum+=i;
i++;
}while(i<=100);
cout<<"sum="<<sum<<endl;
return 0;
}
运行结果如下:
(3) for 循环
for语句的使用最为灵活,既可以用于循环次数确定的情况,可可以用于循环次数未知情况。其语法形式如下:
for(初始语句;表达式1;表达式2)
{
循环体;
}
for语句的执行流程是:首先执行初始语句,再判断表达式1(循环控制条件);如果为真,则执行一次循环体,否则退出循环。每执行一次循环体后,要先计算表达式2的值,再判断表达式1,从而决定要不要继续执行循环体。
下面举一个简单的例子,我们用for()还是来实现求自然数1至100的和。
#include<iostream>
using namespace std;
int main()
{
int sum=0;
for(int i=1;i<=100;i++)
{
sum+=i;
}
cout<<"sum="<<sum<<endl;
return 0;
}
运行结果如下:
使用for()语句需要注意以下几点:
- 初始语句、表达式1、表达式2都可以省略,但是分号不能省略。比如:
for(;;) //相当于while(true)语句,表示将无终止地执行循环体(死循环)
- 表达式1是循环控制条件,如果省略,循环将无终止地进行下去。
- 当初始表达语句是声明语句时,可以包含多个变量的声明,要用逗号隔开。比如:
for(int i=0,j=10; i<=j; i++,j--) k=i+j;
(4) continue和break的用法
- break语句。出现在swtch语句或者循环体结构中,使程序从整个循环体和switch语句内跳出,继续执行逻辑上的下一条语句。break语句不宜用于其他场合。
- continue。可以出现在循环体中,其作用是结束本次循环(即跳过循环块中后面的代码);再重新判断循环条件,决定是否继续执行下一次循环。
(5) 不成熟的goto
goto 语法的形式如下:
JumpToPoint:
循环体;
goto JumpToPoint; //转跳回JumpToPoint处,重新执行循环体
这里需要说明的是:由于goto语句不具有结构性,它的频繁使用会使得程序变得混乱,因此不建议使用它!