C++学习笔记-条件操作符&&开关语句

随着程序越来越复杂,会在代码中出现越来越多的if语句。有些时候我们只要电脑做一个简单的判断,就要用占据多行的if语句,实在有点吓人,使得程序的可读性受到一定的影响。比如之前的程序中,使用标准格式写一段将较大数放入max中的语句占据了八行。即使是比较简便的写法,也至少要占据两行。那么,C++是否还提供了更为简便的书写方法呢?

答案是肯定的,我们可以用一个问号来判断一个条件,具体的语法格式为:

(条件表达式)?(条件为真时的表达式):(条件为假时的表达式)

“……?……:……”称为条件操作符,它的运算优先级比逻辑或还低,是目前为止优先级最低的操作符。含有条件操作符的表达式称为条件表达式。既然是表达式,他就应该有一个计算结果。而这个结果就是已经经过判断而得到的结果。我们可以定义一个变量来存放这个结果,也可以用输出语句把这个结果输出。但是,如果得到结果以后,既没有把他存放起来,也没有把它输出来,那么做这个条件运算就失去意义了。

下面我们用条件操作符来改变之前的程序,看看条件表达式是如何使用的:

#include "iostream.h"

int main()

{

    int a,b,max;

    cout<<"请输入两个数:"<<endl;

    cin>>a>>b;

    max=(a>=b)?a:b;//如果a大于等于b,则把a的值放到max中,否则把b的值放到max中

    cout<<"较大的数是"<<max<<endl;

    return 0;

}

运行结果没有任何区别。而我们达到了缩短代码的目的,增强了程序的可读性。

 

我们已经了解,if……else……可以用来描述一个“二岔路口”,我们只能选择其中一条路来继续走。然而,有时候我们会遇到一些“多岔路口”的情况,用if……else……语句来描述这种“多岔路口”会显得非常麻烦,而且容易把思路搅浑。之前有程序就是用一个if……else……语句描述的“四岔路口”(四种操作符),整个程序占据了将近一页。

如果我们把这些“多岔路”看做电路,那么用if……else……这个“普通双向开关”来选择某一条支路就需要设计一套很复杂的选路器。所以最简便的选路方法当然是做一个像下图一样的开关。

在C++中,也有这样的开关,那就是switch语句。它能够很简捷的描述出多岔路口的情况。具体的语法格式为:

switch(表达式)

{

    case 常量表达式1:

        {

            语句块1;

            break;

        }

        ……

        case 常量表达式n:

        {

            语句块n;

            break;

        }

        default:

        {

            语句块n+1;

        }

}

在switch语句中,我们要记住四个关键词,分别是switch、case、default和break。switch是语句的特征标志;case表示当switch后的表达式满足某个case后的常量时,运行该case以后的语句块。要注意,任意两个case后的常量不能相等,否则switch将不知道选择哪条路走。default表示当表达式没有匹配的case时,默认(default)的运行他之后的语句块;break表示分岔路已经到头,退出switch语句。

下面,我们就用switch语句来改写之前的程序。

#include “iostream.h”

int main()

{

    float a,b;

    char oper;

    cout<<"请输入一个表达式(eg.1+2):"<<endl;

    cin>>a>>oper>>b;

    switch(oper)

    {

        case "+":

        {

            cout<<a<<oper<<b<<'='<<a+b<<endl;

            break;

        }

        case "-":

        {

            cout<<a<<oper<<b<<'='<<a-b<<endl;

            break;

        }

        case "*":

        {

            cout<<a<<oper<<b<<'='<<a*b<<endl;

            break;

        }

        case "/":

        {

            if(b != 0)

            {

                cout<<a<<oper<<b<<'='<<a/b<<endl;

            }

            else

            {

                cout<<"出错了"<<endl;

            }

            break;

        }

        default:

            cout<<"出错了"<<endl;

            break;

    }

    return 0;

}

上述程序的运行结果和之前的运行结果一样。我们发现使用了switch语句以后,代码的平均缩进程度有所减少,阅读代码的时候更简洁易懂。所以,使用switch语句来描述这种多分支情况是很合适的。

switch的一些使用技巧

返回去看之前的程序,我们不难发现这个程序也是一个多分支结构。可是,switch语句只能判断表达式是否等于某个值,而不能判断它是否处于某个范围。而我们要把处于某个范围的每个值都作为一句case以后的常量,显然这太麻烦了。那么我们还能不能使用switch语句来描述这种范围型的多分支结构呢?

通过分析,我们发现了主要起区分作用的并不是个位上的数,而是十位上的数。如果我们能把十位上的数取出来,那么最多也就只有十个分支,不是么?改写如下:

#include "iostream.h"

int main()

{

    int mark;

    cout<<"请输入成绩(0~100):";

    cin>>mark;

    switch(mark/20)

    {

        case 5:

        {

            if(mark>100)//100到119的情况都是mark/20==5,所以要用if语句再次过滤

            {

                cout<<"ERROR"<<endl;

                break;

            }

        }

        case 4:

        {

            cout<<"GOOD"<<endl;

            break;

        }

        case 3:

        {

            cout<<"SOSO"<<endl;

            break;

        }

        case 2:case 1:case 0:

        {

            if(mark>=0)//同样要用if过滤负数

            {

                cout<<"PLEASE WORK HARDER"<<endl;

                break;

            }

        }

        default://其他情况都是出错

        cout<<"ERROR"<<endl;

        break;

    }

    return 0;

}

这个写法比之前的写法要冗长一些,但是这里提到这个程序的目的是告诉大家一种使用switch的方法--"以点盖面"。

 

在程序设计中,我们经常会遇到这样的问题:我们希望处理的数据和电脑能够处理的数据可能有所不符。不符合的情况一般有两种,一种是范围不符合,另一种是类型不符合。对于范围不符合,我们一般考虑的是使用代数式对数据进行处理。比如C++中的随机函数能够产生一个0~32768之间的一个整数,如果我们希望得到一个0~10之间的随机数,那么就用它对10取余数,那么结果一定就在这个范围内。对于类型不符合,我们只好尽量用已有的数据类型来描述这种难以表达的类型。就如同电脑中用0和1表示真和假一样。



学习ing in 微学苑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值