zoukankan      html  css  js  c++  java
  • c++第二十六天

    p131~p135:

    1、除非必要否则不使用后缀加加(减减),会有额外的性能开销。


    2、混用解引用和递增运算符。*pointer++,后缀运算符优先于解引用运算符。

    3、运算对象可按任意顺序求值,即使是在赋值号两侧也无法确定究竟哪边先求。

    p133

    1、点运算符和箭头运算符。ptr->mem等价于(*ptr).mem。

    2、解引用运算符*优先级低于点运算符.!!!别写*p.size()这样的表达式。(等价于*(p.size()))

    p134
    1、条件运算符。cond ? expr1 : expr2;先判断cond的真假,然后根据真假决定计算哪一条表达式。

    2、嵌套条件运算符。

    #include<iostream>
    int main()
    {
        int grade;
        std::cin >> grade;    
        std::cout << ((grade > 90) ? "high pass" : (grade < 60) ? "fail" : "pass") << std::endl;
        return 0;
    }

    3、条件运算符满足右结合律。

    4、条件运算符的优先级非常低,通常要在两段加括号:(cond ? expr1 : expr2)

    练习 4.17

    练习 4.18
    跳过第一个元素,从第二个元素开始输出。

    练习 4.19
    (a)确保ptr指针非空,判断ptr指向元素非零,最后将ptr移动到下一位。
    (b)假设ival的值为0,则原式等价与“0 && 1”。
    (c)前两个表达式属于短路求值,运算顺序确定,而这个表达试的行为是未定义的:无法确定运算顺序。
    改为:vec[ival+1] <= vec[ival]

    练习 4.20
    a 合法,访问*iter后iter移动到下一个元素。
    b 非法,访问*iter,之后将*iter这个元素+1,由于是字符串所以加1操作非法。
    c 非法,点运算符优先级高,应该改为(*iter).empty()。
    d 合法
    e 非法
    f 合法

    练习 4.21

    #include<iostream>
    #include<vector>
    int main()
    {
        std::vector<int> ivec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        for (int &x : ivec) {
            (x % 2 == 1) ? x *= 2 : x;
        }
        for (int &x : ivec) {
            std::cout << x << std::endl;
        }
        return 0;
    }

    练习 4.22

    1

    #include<iostream>
    int main()
    {
        int grade;
        std::cin >> grade;
        std::cout << ((grade > 90) ? "high pass" : (grade > 75) ? "pass" : (grade > 60) ? "low pass" : "fail") << std::endl;
        return 0;
    }

     2

    #include<iostream>
    using std::cout;
    using std::endl;
    int main()
    {
        int grade;
        std::cin >> grade;
        if (grade > 90) {
            cout << "high pass" << endl;
        } else if (grade > 75) {
            cout << "pass" << endl;
        } else if (grade > 60){
            cout << "low pass" << endl;
        } else {
            cout << "fail" << endl;
        }
        return 0;
    }

    版本2更容易理解一些。

    练习 4.23

    #include<iostream>
    #include<string>
    using std::string;
    int main()
    {
        string s = "word";
        // 错误的表达式:string pl = s + s[s.size() - 1] == 's' ? "" : "s";
        // 下标运算符[]的优先级最高,最先计算,之后是+、==、?:、=
        // 之所以会错是因为按照这个运算顺序会把字符串s + (s[s.size() - 1]和字符's'比较,这是非法的。
        string pl = s + (s[s.size() - 1] == 's' ? "" : "s");
        std::cout << pl << std::endl;
        return 0;
    }

    练习 4.24

     布吉岛。

  • 相关阅读:
    LeetCode分类专题(五)——动态规划1-子序列
    LeetCode分类专题(四)——双指针和滑动窗口1
    LeetCode分类专题(三)——二分查找1
    消息队列(一)——Kafka概述
    Java多线程(五)——synchronized关键字原理
    Java多线程(四)——volatile关键字原理
    Redis(五)——主从复制、哨兵
    Redis(四)——过期、持久化、事件
    Redis(三)——底层数据结构
    MySQL知识点
  • 原文地址:https://www.cnblogs.com/xkxf/p/6502584.html
Copyright © 2011-2022 走看看