【C++笔记】六、条件语句和逻辑运算符

1.条件语句if和do...while(0)形式的宏

1.1 if

//  如果条件中使用了数值类型的变量,建议将变量写在后面,e.g. 10 == i
    int i = 100;
    if(i = 10)   // if 条件永远为真
    {
        cout << "i == 10" << endl;
    }
    
    if(i == 10)
    {
        cout << "i == 10" << endl;
    }
    else if(i == 11)
    {
        cout << "i == 11" << endl;
    }
    else if(i == 12)
    {
        cout << "i == 12" << endl;
    }
    else      //  最后用单else兜底
    {
        cout << "else" << endl;
    }

1.2 do...while(0)形式的宏

#define PROCESS do{cout << "process" << endl; cout << "test" << endl;}while(0)
#define PROCESS1  cout << "process" << endl; cout << "test" << endl;   // 多条语句
#define PROCESS2  {cout << "process" << endl; cout << "test" << endl;}  //和条件语句冲突
 
bool flag = true;
if(flag)
    PROCESS1;   // 打印 process test

bool flag = false;
if(flag)
    PROCESS1;   // 打印test,因为宏PROCESS1替换后,是两条语句,所以即便if不成立,也会执行后面那条

bool flag = false;
if(flag)
    PROCESS2;   // 打印 process test

bool flag = false;
if(flag)
    PROCESS2;  
else  /* 这里会报错,因为if...else if...else...语句没结束的话{}后面是不能加分号的,但PROCESS2后面如果不加分号,就不符合宏调用的格式 */
    cout << "else" << endl;

bool flag = false;
if(flag)
    PROCESS;  // 因为是while(0),所以执行一个do,后面就退出了,只执行一次
else  
    cout << "else" << endl;

2.逻辑表达式与短路问题

逻辑运算符  &&  || !

    int m = 10;
    int n = 20;

    if(m == 10 || n == 44)
    {
        cout << "m == 10 || n == 20" << endl;   // m == 10 || n == 20
    }
    
    if(!(m > 10))  // 相当于 m <= 10
    {
        cout << "!(m > 10)" << endl;   // !(m > 10)
    }

    if(m == 10 || (cout << "abc" << endl,n == 44))    /* 不会输出‘abc’,表达式短路,只要逻辑运算符前面的表达式能决定整个表达式的最终值,那逻辑运算符后面的表达式就不会再运算了 */
    {
        cout << "m == 10 || n == 20" << endl;   // m == 10 || n == 20
    }

    if(m == 30 && (cout << "abc" << endl,n == 44))    // 不会输出‘abc’,短路
    {
        cout << "m == 10 || n == 20" << endl;   // m == 10 || n == 20
    }


举例:使用短路特性为程序‘上保险’,myClass如果为空的话,myClass.process()就会抛出异常,为了避免程序抛出异常,可以这样写:

     MyClass *myClass;

     if(myClass != NULL && myClass.process())  /*  如果myClass为空,逻辑与前面为假,后面短路,防止了程序报错,如果myClass非空,则myClass.process()正常执行  */
     {
        ... ...
     }

3.处理字符的函数集:cctype

#include <iostream>
#include <cctype>   // 声明头文件
using namespace std;
int main(int argc, const char * argv[]) {

    char c1 = 'a';
    char c2 = '5';
    char c3 = 'A';

    if(isalpha(c1))  // 判断 c1 是否为字符
    {
        cout << "c1 is an alpha." << endl;  // c1 is an alpha.
    }
    
    if(isalnum(c2))  // 判断 C2 是否为数字
    {
        cout << "c2 is a num." << endl;     // c2 is a num.
    }
    
    if(isupper(c3))  // 判断 C3 是否为大写
    {
        cout << "c3 is a upper alpha." << endl;  // c3 is a upper alpha.
    }
    
    c3 = tolower(c3);  // 转换为小写
    cout << "c3 = " << c3 << endl;  // a
    return 0;
}

4.问号 (?) 操作符

  // 三元操作符    (condition)?value1:value2

    int m = 3;
    int n = 6;
    
    string s = (m < n)?"hello":"world";
    cout << "s = " << s << endl;    // s = hello

// 问号表达式的分解
    if(m < n)
    {
        s = "hello";
    }
    else
    {
        s = "world";
    }

// 稍微复杂些的语句,问号表达式能表示吗?    
    if(m == n)
    {
        s = "m == n";
    }
    else if(m < n)
    {
        s  = "m < n";
    }
    else
    {
        s = "m > n";
    }

// 用问号表达式表示上述条件语句
    s = (m == n)?"m == n":(m < n)?"m < n":"m > n";  // 用两次问号操作符实现复杂条件语句
    
    cout << s << endl;     // m < n

// 更加复杂的条件语句,问号表达式能表示吗?    
    if(m < n)
    {
        if(m == 3)
        {
            s = "m < n && m == 3";
        }
        else
        {
            s = "m < n && m != 3";
        }
    }
    else
    {
        s = "m >= n";
    }
// 遇到if就加问号(?),遇到else就加冒号(:)
    s = (m < n)?((m == 3)?"m < n && m == 3":"m < n && m != 3"):"m >= n";
    cout << "s = " << s << endl;

// 带有其他操作的条件语句也能用问号表示
    if(m < n)
    {
        if(m == 3)
        {
            int i = 20;
            i++;
            i+=i*i;
            cout << " i = " << i << endl;
            s = "m < n && m == 3";
        }
        else
        {
            s = "m < n && m != 3";
        }
    }
    else
    {
        s = "m >= n";
    }

    int i = 20;   // 定义语句不能放在问号表达式后面,要单独拿出来
    s = (m < n)?((m == 3)?(i++, i+=i*i,cout << " i = " << i << endl, "m < n && m == 3"):"m < n && m != 3"):"m >= n";
    cout << "s = " << s << endl;

5.条件语句:switch

5.1 switch的基本语法和规则

//  多分支条件语句    
    int m = 2;
    if(m == 1)
    {
        cout << "m == 1" << endl;
    }
    else if(m == 2)
    {
        cout << "m == 2" << endl;   // m == 2
    }
    else if(m == 3)
    {
        cout << "m == 3" << endl;
    }
    else
    {
        cout << "m是其他值." << endl;
    }

// switch 语句  ,default相当于else,用来兜底
    switch (m) {
        case 1:
            cout << "m == 1" << endl;
            break;       /* switch语句进入一个case执行完之后,不会自动跳出,而是会按顺序执行下一个case,所以这里要用到break跳出switch */
        case 2:
            cout << "m == 2" << endl;
            break;
        case 3:
            cout << "m == 3" << endl;
            break;
        default:
            cout << "m是其他值." << endl;
            break;
    }

5.2 switch(expression)中expression的限制

// 布尔类型可以用于switch,不能返回整数值的变量(如:float),不能用于switch
    bool flag = true;
    switch (flag) {
        case true:
            
            break;
            
        default:
            break;
    }

5.3 在switch语句中使用枚举类型和布尔类型

    enum {ONE = 1, TWO = 2, THREE} num1;   // num1的取值可能是ONE,TWO,THREE中的一个
    int k = 2;
    switch (k) {
        case ONE:    /*  相当于1  */
            break;
        case TWO:    /*  相当于2  */
            break;
        case THREE:
            break;
        default:
            break;
    }

    num1 = THREE;
    switch (num1) {
        case ONE:            
            break;
        case THREE:
            break;
        default:
            break;
    }

5.4 用switch实现或的逻辑关系

    if(2 == m || 3 == m)   // 将常量写到前面,可以避免少写一个等号
    {
        cout << "abc" << endl;
    }

// 用switch语句表示逻辑或
    switch (m) {
        case 2:
                           // 把这里的break去掉,就可以实现逻辑或
        case 3:
            cout << "abc" << endl;
            break;                      
        default:
            break;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DUANDAUNNN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值