条件语句控制结构在应用程序中满足特定条件情况下才会被正确执行。它主要包括if、switch两类控制语句。实际的软件程序编写中主要采用该结构判断不同条件下的业务流程,并按照预期设想执行下去。下面将会通过对该类结构基本概念的介绍以及配合实际用例,详细讲述条件语句在软件程序编写中的使用情况。
5.2.1 if单一选择结构语句
条件语句,根据条件判断结果得出的结论,从而决定程序的流程分支处理走向。对于条件语句,C++提供了比较简单用于表示单一选择结构的if语句,其语法非常直观和简洁。
if (condition)
{
//处理流程
}
单选结构的关键字为if,其后一对小括号中放置判断条件。紧跟着下一行开始一对大括号中放置需要执行的代码块。当然可以直接紧跟单条语句,但是仅仅是紧随其后的第一行语句属于该判断条件符合情况下执行的(加成语句块的形式更有利于代码的阅读以及防止书写错误)。小括号中的判断条件必须为真,接下去的语句块才会被执行。下面是if语句几种使用情况定义。
if (factoryFlag) //factoryFlag标记值是否为真,为真即执行以下代码块
{
… //代码块
}
if (!factoryFlag) //factoryFlag标记值是否为假,!factoryFlag则为真即执行以下代码块
{
… //代码块
}
if (len == 0) //长度值len是否恒为0,条件成立即执行以下代码块
{
… //代码块
}
if (len != 0) //长度值len是否不等于0,条件成立即执行以下代码块
{
… //代码块
}
if (ptr == NULL) //指针变量ptr值是否为空,为空则即执行以下代码块
{
… //代码块
}
if (ptr != NULL) //指针变量ptr值是否不为空,条件成立即执行以下代码块
{
… //代码块
}
以上几个软件编程中常用的if判断形式,基本包含了常见的条件判断的使用情况。对于if单一条件选择语句,其执行过程是相当简单的。只要判断条件成立,紧跟其后的代码块就会被执行。当然判断条件可以是单个标记型变量,也可以多个组合使用,还可以是表达式计算结果作条件。if语句同样可以嵌套使用,可以在其语句块之内再定义使用该单选结构。
5.2.2 if/else二路及多路选择结构语句
if的单路选择结构只支持一种判断情况的执行。通常情况下,可能需要根据判断条件支持不同程序走向控制。尽管if单路选择结构可以通过多条来组合实现不同程序走向控制,但是二路及多路选择结构在程序组成上会显得更加高效、紧凑。C++针对这种需求,提出了if…else以及if…else if控制结构。if…else为典型的二路选择结构,支持当某种条件判断不成立时的默认处理。其语法基本定义如下所示。
if (condition)
{
… //代码体
}
else
{
… //代码体
}
如果条件判断成立,执行紧随其后的代码块。如果条件不成立默认执行else之后的代码块处理。对于有多路判断请求的需要,C++提供了if…else if结构,其基本语法定义如下所示。
if (condition1)
{
… //代码体
}
else if (condition2)
{
… //代码体
}
else if (conditonn)
{
… //代码体
}
else
{
… //代码体
}
该多路选择结构从上到下逐个的对定义的条件进行判断,只要条件满足就执行与其相关的代码块,跳过其余判断条件。如果以上条件判断都不满足则执行最后一个else的代码块,作为最终程序的默认处理。该结构在某种情况下可以和switch结构互换,实现多路选择控制,但是switch结构在多路选择方面显得代码更加的简洁美观。
5.2.3 switch多路选择结构语句
虽然可以通过if条件语句来实现多路选择的功能,但是那样的代码通常比较的难以理解。尤其嵌套比较深的情况下,开发者很可能会被复杂嵌套的if语句扰乱,从而导致程序处理达不到预期结果。这类问题在现实开发中切实存在,并且增加程序维护人员的理解难度。而C++提供的switch语句就显得简洁明了许多,switch多路选择结构基本语法定义如下所示。
switch(expression) //switch语句结构,括号中为表达式
{
casevalue1:
… //代码体
break;
casevalue2:
… //代码体
break;
casevaluen:
… //代码体
break;
default:
… //代码体
break;
}
执行switch语句时,根据switch关键字后的表达式逐一的与case之后的常量或产量进行比较。若与之相等则执行其后的语句,若不相等则继续比较下一个。直到最后如果都没有条件相同的情况下执行default之后的默认处理语句。对于switch多路选择结构,需要作如下说明,初学者在应用该结构中了解并掌握这些注意点。
q switch结构关键字后小括号内可以是变量、字符表达式等,该值类型必须要和case后的值类型一致。
q case关键字后必须是常量或者常量表达式,每个case语句之后可以是单条语句、语句块或者直接为空。
q 每个case语句执行*后要加上break语句,否则会继续执行下去,不会跳出该控制结构。
q default语句不是必须的,但是最好加上该语句作该结构默认处理工作。
下面通过一个完整实例来了解switch语句在应用程序中的使用情况。
1.准备实例
打开UE工具,创建新的空文件并且另存为chapter0501.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
/**
* 实例chapter0501
* 源文件chapter0501.cpp
* 选择语句switch实例
*/
#include <iostream>
using namespace std;
/*主程序入口*/
int main()
{
chargrade; //定义字符变量grade表示成绩等级
cout<<"pleaseinput a grade char:"<<endl; //提示用户输入字符数据
cin>>grade; //从键盘输入字符数据
switch(grade) //switch控制结构
{
case'A'|'a': //case后为常量表达式
cout<<"Thestudent score large than 90!"<<endl; //打印满足该case提示信息
break; //跳出switch循环结构
case'B'|'b':
cout<<"Thestudent score large than 80 and less than 90!"<<endl;
break;
case'C'|'c':
cout<<"Thestudent score large than 60 and less than 80!"<<endl;
break;
default: //默认处理
cout<<"Thegrade is error!"<<endl; //打印出错信息
break;
}
return0;
}
上述实例主要演示了采用switch结构分别计算打印学生成绩等级功能。通过输入字符型变量表示的等级来计算打印相关学生具体成绩。
2.编辑makefile
Linux平台下需要编译源文件为chapter0501.cpp,相关makefile工程文件编译命令编辑如下所示。
OBJECTS=chapter0501.o
CC=g++
chapter0501: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter0501
clean:
rm -fchapter0501 core $(OBJECTS)
submit:
cp -f -rchapter0501 ../bin
cp -f -r*.h ../include
上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer@localhost src]$ make
g++ -c -o chapter0501.o chapter0501.cpp
g++ chapter0501.o -g -o chapter0501
[developer@localhost src]$ make submit
cp -f -r chapter0501 ../bin
cp -f -r *.h ../include
[developer@localhost src]$ cd ../bin/
[developer@localhost bin]$ ./chapter0501
please input a grade char:
a
The student score large than 90!
以上实例主要根据用户输入不同的成绩等级字符,得出该等级字符的真实成绩范围提示信息。程序中主要使用switch结构,结构中首先定义一个字符变量并提示用户输入该变量信息。根据传入的数据信息,对比case中的常量表达式值,如果能够匹配就执行该case下的代码体,执行完毕后通过break语句跳出switch控制结构。以上case常量表达式值对比情况下如果都不匹配,则执行default默认处理中的代码。本程序为了兼容成绩等级的大小写,在case后的常量表达式中增加了大小写字母和或运算符号(|)。在匹配过程中,只要其一符合要求,则执行该case下的代码体。
另外默认default处理部分非常重要,在软件开发中经常需要验证程序是否按照正确的流程执行。尤其是庞大的软件系统程序中,会有一类打印执行结果以及出现异常情况或者不符合条件的代码穿插在代码体中。这类代码通常是以日志形式出现的,即可以通过日志文件形式记录程序执行流程,以检查程序执行是否正确。在switch选择结构中程序输入的表达式结果值是否超出各个选项的定义的范围,需要部分提示信息也属于这种类型之一!
5.2.4 实例5-2简单条件语句判断程序
通过前面介绍,条件控制结构相对清晰明了,其主体思想是基于开发者设计中给出的不同的条件判断结果,决定程序不同的处理流程。上述讲述条件控制结构中由于已经给出switch多路选择结构的实例,所以此处实例中主要运用了if条件控制结构,来实现应用程序的控制。
1.准备实例
打开UE工具,创建新的空文件并且另存为chapter0502.cpp。该代码文件随后会同makefile文件一起通过FTP工具传输至Linux服务器端,客户端通过scrt工具访问操作。程序代码文件编辑如下所示。
/**
* 实例chapter0502
* 源文件chapter0502.cpp
* 简单条件语句判断程序
*/
#include <iostream>
using namespace std;
/*主程序入口*/
int main()
{
intvalue; //定义整型变量value
cout<<"pleaseinput a value:"<<endl; //打印输入整型值提示信息
cin>>value; //用户输入整型值
if(value> 0) //如果该整型值大于0,打印大于0信息
{
cout<<"Thevalue is large than 0!"<<endl;
}
elseif(value == 0) //如果该整型值恒等于0,打印恒等于0信息
{
cout<<"Thevalue is equal 0!"<<endl;
}
else //如果该整型值小于0,打印小于0信息
{
cout<<"Thevalue is less than 0!"<<endl;
}
return0;
}
上述实例主要通过if…elseif结构实现类似switch多路选择的功能。程序中通过条件的拆分判断具体程序走向控制。
2.编辑makefile
Linux平台下需要编译源文件为chapter0502.cpp,相关makefile工程文件编译命令编辑如下所示。
OBJECTS=chapter0503.o
CC=g++
chapter0502: $(OBJECTS)
$(CC)$(OBJECTS) -g -o chapter0502
clean:
rm -fchapter0502 core $(OBJECTS)
submit:
cp -f -rchapter0502 ../bin
cp -f -r*.h ../include
上述makefile文件套用前面的模板格式,主要替换了代码文件、程序编译中间文件、可执行程序等。在编译命令部分-g选项的加入,表明程序编译同时加入了可调式信息。
3.编译运行程序
当前shell下执行make命令,生成可执行程序文件,随后通过make submit命令提交程序文件至本实例bin目录,通过cd命令定位至实例bin目录,执行该程序文件运行结果如下所示。
[developer@localhost src]$ make
g++ -c -o chapter0502.o chapter0502.cpp
g++ chapter0502.o -g -o chapter0502
[developer@localhost src]$ make submit
cp -f -r chapter0502 ../bin
cp -f -r *.h ../include
[developer@localhost src]$ cd ../bin
[developer@localhost bin]$ ./chapter0502
please input a value:
2
The value is large than 0!
如上简单条件控制结构实例中,程序中应用了if条件控制结构,主要实现功能在于根据用户输入的整型数据,判断其与零值比较大小的结果。程序运行结果中用户输入整型数据2,在函数体中按照顺序执行到第一个if判断语句处,由于整型值2是大于0则if结构中条件判断为真成立,所后执行该if语句后的代码体。如果该条件不成立,则继续向下执行判断,直至默认情况下的else处理,由于与0值比较只存在三种情形,因此最后默认的条件等价于value值小于0的判断条件。