• C++primer学习笔记(二)——Chapter 4


    4.1  Fundamentals

    1.Basic Concepts

    (1)操作符分为一元,二元或者三元操作符;

    (2)复杂的表达式中含有很多操作符时:

          规则一:分为不同的级别,级别高的先运行;

          规则二:相同级别的操作符有执行顺序的确定;

    (3)操作符可以改变操作数的类型

         一般将级别低的转化成级别高的

    (4)重载运算符

        相同的运算符在对不同类型的对象进行操作的时候,会有不同的功能;

    (5)Lvalue和Rvalue

        显而易见:Lvalue指的是Left value,Rvalue指的是Right value;所谓的Lvalue简单的来说就是可以放在‘=’左边的value,而Rvalue则是不能放在‘=’左边的value。实际上Lvalue就是持续暂用内存的value,即是使用它所在的内存,而Rvalue则是使用其内容,就是值,而不是用其所占有的内存空间。

    4.2   Arithmetic Operators

    Table:       Arithmetic Operators(Left   Associative)  
    Operator Function Use
    + unary puls + expr
    - unary minus - expr
         
    * multiplication expr * expr
    / division expr / expr
    % remainder expr % expr
         
    + addition expr + expr
    - subtraction expr - expr

    1、分析

    (1)优先级

              这些就是代数相关的操作符。然后等级有三个,正负号最高,然后是乘除,然后再是加减;统一级别的操作符按照从左到右的顺序进行计算。

    (2)操作数

             这些操作符基本上能对几乎所有的数据类型进行操作,但是在对不支持的类型进行操作的时候,往往会将类型往高级的转换。

    e.g bool型变量

    bool b = true;
    bool b2 = -b;    //  b2 is true;

           这是由于bool型变量没有相应的‘-’运算,所以在计算的过程将bool转化成了int,再进行计算,最后赋值的时候还有转化为bool型,-1转化为bool型依然是true,所以在进行操作符运算时,要留心那些变量的类型。

    (3)一些新规则

    (-m)/n    equal to   m/(-n)     equal to     -(m/n)

    m%(-n)         equal to         m%n

    (-m)%n         equal to         -m%n

    4.3  Logical and Relational Operators

    Table 4.2:Logical and Relational Operators
    Associativity Operator Function Use
    Right ! logical NOT !expr
           
    Left < less than expr < expr
    Left <= less than or equal expr <= expr
    Left > greater than expr > expr
    Left >= greater than of equla expr >= expr
           
    Left == equality expr == expr
    Left != inequality expr != expr
           
    Left && logical AND expr && expr
    Left || logical OR expr || expr

    1、Logical AND and OR Operators

        AND就是两者都成立则为真,OR则是有一个成立就为真

    PS:重点在于逻辑短路

       就是说在使用AND和OR操作符的时候,其顺序是从左往右,如果左边的可以确定AND 和 OR 的真假的时候,右边的操作就不需要进行。

    e.g   如果 && 左边的值是false,那么无论右边是真是假都是false,所以右边的表达式不再计算

           如果 || 左边的值是ture,那么无论右边是真是假都是true,所以右边的表达式不再计算

    2、Logical NOT Operator

    就是真的变成假的,假的变成真的。

    3、The Relational Operators

         关系运算符,如果是真的就返回true,否则就返回false

    4、bool转换成其他类型时:true 转换成 1 ,false转化成 0

        其他类型转化成bool型时,非0数转换成 true,0 则转换成false;

    4.4 Assignment Operators

    1、注意点:

    (1)赋值操作符的左侧一定是一个lvalue;

    (2)赋值操作由右侧转换到左侧的时候,如果type不一样,那么就需要进行类型的转换,从而可能会导致数据的丢失和错误。

    (3)赋值操作符的运算顺序是从右到左的说;

    (4)’=‘ 和’==‘的区别

    2、复合操作符

    += -= *= /= %=
    <<= >>= &= ^= |=

    a+=b    等价于a = a + b;   这样貌似会剩打几个字。。。

    4.5 Increment and Decrement Operators

    1、++i,i++的区别

         i++  :  就是编译器会临时开辟一块内存,记录i+1后的值,然后继续用i做运算,最后再把i+1赋值给i;

         ++i   : 直接就是对i进行+1的操作,再去进行别的运算。

    Ps:所以我们应该在非必要的情况下,使用++i用来节约空间或者时间的资源。

    2、*iter++ 的运算顺序

         等价于*(iter++),然而iter++又是先用的,再加,所以是先*iter,然后再iter+1;

    3、一个错误

         *beg = toupper(*beg++)

    这个不同的编译器会有不同的处理方式,如果是等号右边先进行计算的话,就等价于

    *(beg+1) = toupper(*beg);

    如果是左边先进行的话

    *beg = toupper(*beg);

    4.6  The Member Access Operators

    e.g 

    string s1 = '' a strsing",   *p = &s1;
    auto n = s1.size();                   
    n= (*p).size;
    n= p->size();

           dot操作符以及arrow操作符都是用来访问成员的。其中dot操作符是用再一个对象上的,而arrow作符则是用在一个对象的指针上的;

    Ps:注意dot操作符的优先级高于  *  操作符的,所以使用(*p).size()的时候一定记得要加上括号的说。

    4.7 The conditional Operator

    (1)用法

    cond ? expr1:expr2;

    cond  : 指的就是condition 就是比较条件。

    expr1: 如果cond是真的话就执行此句;

    expr2:如果cond是假的话就执行此句;

    (2)例子

    finalGrade = (grade > 90) ? "high pass"
                                    : (grade < 60) ? "fail" : "pass";

            这是一个嵌套使用的例子,可以节约代码的行数,使得简介大方,但是不能搞得太多= =,否则成

    一团浆糊了 = =。

    Attontion:  由于条件操作符的优先级不高,所以再码复合表达式的话一定切记要加上括号。

                     e.g:  cout << ((grade < 60) ? “fail”:”pass”);

    4.8 The Bitwise Operators

    image

    **Bitwise Operators 处理的对象最好是unsigned 类型的,因为是直接对位进行操作,所以,如果对于正数,会更容易。

    1、用法

    1. bits<<8; // 就是将bits的全部位向左移动8位,而且如果有超出的本部,那些部分直接省略。

      bits>>32; // 就是将bits的全部位向右移动32位,而且如果有超出的本部,那些部分直接省略。

             ~bits //就是将每一位的数字取反,0变成1,1变成0;

              B1 & b2; //就是对每一位进行"与"操作。都是1才是1,否则就为0;

              B1 ^ b2 //对每一位进行"亦或"操作,两个数字不一样就为1,一样就为0;

              B2 | b2 //对每一位进行"或"操作,两个数字中有一个1就为1,否则就为0;

    2、优先级

    1. 在中等级别,必算式运算符低,但又比比较运算符等高一些。

    4.9  The sizeof Operator

    1、逻辑顺序

              是从右往左

    2、使用方法

    sizeof (type)
    sizeof expr

    3、sizeof的作用

    sizeof char  or an expression of type har  is  guaranteed to be 1;

    sizeof作用于一个引用的话,返回的是他引用对象的类型的长度

    sizeof作用于一个指针,返回的是指针指向此类型所需要的长度

    sizeof·作用于(*P)指针的内容,返回的是,指针的类型的长度(无论指针是不是野指针都可以)

    sizeof作用于数组,会返回数组的长度;

    sizeof作用于string 和 vector 返回这些类型的长度,而不是返回其中所含元素的个数

  • 相关阅读:
    eslint 的 env 配置是干嘛使的?
    cookie httpOnly 打勾
    如何定制 antd 的样式(theme)
    剑指 Offer 66. 构建乘积数组
    剑指 Offer 65. 不用加减乘除做加法
    剑指 Offer 62. 圆圈中最后剩下的数字
    剑指 Offer 61. 扑克牌中的顺子
    剑指 Offer 59
    剑指 Offer 58
    剑指 Offer 58
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/3923201.html
Copyright © 2020-2023  润新知