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

来源:互联网 发布:电视软件看港澳台 编辑:程序博客网 时间:2024/05/21 09:39
随着程序越来越复杂,会在代码中出现越来越多的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 微学苑
0 0