C++菜鸟学习笔记系列(14)
本期主题:条件语句
和其他大多数语言类似的,C++语言也为我们提供了条件执行语句(if、switch)这些都是我们写程序中最常见也是最常用的语句。在本期的博客中我们就主要围绕这两个语句进行简单的讨论。
在开始之前,我们先了解一下C++中语句的定义。
C++中存在简单语句和复合语句,一般来说一条语句就是一个表达式以分号结束,这样就变成了表达式语句。
例如:
val + 10;
当然上述代码并没有什么实际效果,虽然执行了加法但是相加的结果并没有被使用。
最简单的语句是空语句,空语句就是一个单独的分号(;)。如果我们在程序中的某个地方需要写一条语句,但是这条语句又不需要做什么事情,这时候就可以用空语句了。
例如:
while (cin >> val && val !=3)
;
注意:对于分号的使用我们要记住不能漏写分号(;)也最好别多写分号(;)有的时候我们多写分号并不会造成什么语法错误,同时也不会导致逻辑上的错误。
例如:
val = val + 10;;
这样只是相当于又加了一条空语句而已。但是如果我们出现这种情况呢?
int val = 0;
while (val !=3);
++ val;
这样则会造成出现一个死循环,所以我们不要漏写也最好不要多写分号。
复合语句
复合语句就是指用花括号括起来的语句和声明的序列,比如我们在使用while、for等循环语句的循环体通常是很多条语句,这时就需要用一个花括号把多条语句括起来(当然复合语句也可以为空的)。复合语句也被称为块。一个块就是一个作用域(在其中定义的名字只能在其内部及嵌套在块中的子块使用)。
言归正传,C++为我们提供了 if 、switch 两个条件语句。其中if语句通过条件决定控制流,switch语句计算一个整型表达式的值,然后根据这个值从几条执行语句中选一条进行计算。
(1)if语句
if语句的基本作用是通过判断一个指定的条件是否为真,根据判断的结果决定是否执行下面的语句,if语句还可以含有else分支。
例如最简单的if语句形式:
if ( 条件为true)
{
执行语句1
}
带有else分支的形式:
if ( 条件为true)
{
执行语句1;
}
else
{
执行语句2;
}
嵌套if语句,通过引出else分支这个概念我们可以想到,如果多个if…else语句是否可以套在一起使用呢?答案是肯定的,我们可以通过嵌套if语句来表达我们的多个判断条件,下面我们来看一个小例子:
/*
author:wxc_1998
date:2018/10/21
*/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void main()
{
string score = "FDCBA";
int grade = 0;
cout << "please input the grade of you: " << endl;
cin >> grade;
string level = "";
if(grade < 60)
{
level = score[0];
}
else
{
if (grade != 100)
{
level = score[(grade - 50) / 10];
if (grade % 10 > 7)
level += "+";
else if (grade % 10 < 3)
level += "-";
}
else
level = "A++";
}
cout << "the level of you grade is: " << level;
cout << endl << "press any key to continue!";
cin.clear();
cin.sync();
cin.get();
}
在上述代码中我们通过对嵌套if语句的使用实现了对处于不同分数段的成绩进行了分类。
注意:
(1)我们在使用嵌套if语句时要特别注意else分支和if语句间的匹配是否正确,这是一个“悬垂else”的问题,当if分支的数量多于else分支时,else分支会自动的和最近的尚未匹配的if配对,而不能简单的根据程序的缩进形式进行判读。当我们想避免这种情况的出现时,我们可以使用花括号来控制执行的路径,例如把最近的if语句放进括号内部,那么它就不能和外部的else匹配了。
(2)我们最好不要用if…else进行多次嵌套,这样可能会导致我们自己的逻辑比较混乱,使自己写的程序不够整洁
(2)switch语句
switch语句为我们提供了一个便利的途径使得我们能够从若干固定项中做出选择。我们先看一个比较典型的例子:
/*
author:wxc_1998
date:2018/10/21
*/
#include <iostream>
using namespace std;
void main()
{
int i , count[10] = {0}, other_count = 0;
cout << "please input a integer(0 - 9): " << endl;
while (cin >> i)
{
switch(i)
{
case 0:
++ count[0];
break;
case 1:
++ count[1];
break;
case 2:
++ count[2];
break;
case 3:
++ count[3];
break;
case 4:
++ count[4];
break;
case 5:
++ count[5];
break;
case 6:
++ count[6];
break;
case 7:
++ count[7];
break;
case 8:
++ count[8];
break;
case 9:
++ count[9];
break;
}
}
for (int j = 0; j != 9 ; ++j)
{
cout << j << "appeared " << count[j] << " times!" << endl;
}
cout << "out of range number appeared : " << other_count << " times!" << endl;
cout << endl << "press any key to continue!";
cin.clear();
cin.sync();
cin.get();
}
在上述代码中switch语句先对括号内的表达式求值(这里就是i的值)并转化为整数类型,然后与后续每个case标签的值比较。如果某个case标签的值和其匹配成功,那么则执行该标签后的语句直到遇到break为止。如果没有case标签与其相匹配,那么则会一直运行到switch语句结束。
遇到break语句和运行到switch语句结束都会退出switch语句的控制权到外部的语句(这里就是到while语句的条件部分)。
注意:一般来说我们习惯性的在每个case标签后都加上上一个break;语句,但是如果程序要求我们不能加break;语句那么我们也可以不加。此时我们要理解我们如果没有加break;语句那么在匹配了case标签后会一直执行直到遇到break;。
例如上述代码中我们改成:
while (cin >> i)
{
switch(i)
{
case 0:
case 1:;
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
++ count[9];
break;
}
}
我们输入0-9之间的任意一个整数,count[9]的值都会加1。
一般来说,除非必要,我们最好不要省略break;
default标签
我们在前面说如果没有任何case标签匹配成功,那么到达switch结尾处会直接跳出switch控制。但是还有一个情况就是我们想让其在没有找到case标签配对时还能够执行一定的语句,那么我们应该怎么办呢?C++语言中为我们提供了default语句供我们使用,当所有的case标签都没有匹配时则执行default语句后的表达式。
例如我们在上述程序中输入了0-9以外的整数,那么所有的case标签都不能匹配成功,我们还想要统计一下有多少整数在0-9之外,那么我们只需在switch后加上:
default:
++ other_count;
break;
当然如果我们不需要程序在没有配对到case标签做什么事情时,也可以不添加default标签。
关于switch语句我们就介绍这么多,下面我再写两个我们在写程序时易犯得错误。
(1)case标签后的值一个要是一个常量(加const或者直接用字面值)。
(2)一个case标签就是一个块,一个域,我们最好不要在case标签后使用定义语句,虽然这样不会出现什么语法错误,但是这个域太小了,我们在这里定义了一个变量只能在这个case标签中用,下一个case中就不能使用更不要说switch语句外的区域了。
好了,这次就写到这里了,我们下次再见!
注:虽然这篇博客的内容十分简单,但是大家若有转载还请标明出处!