zoukankan      html  css  js  c++  java
  • 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 返回这些类型的长度,而不是返回其中所含元素的个数

  • 相关阅读:
    mysql 锁
    python——三道贪心算法例题
    mysql 常见面试题
    API 管理工具
    如何实现一个简化版的 jQuery
    js设计模式--发布订阅模式
    React应该如何优雅的绑定事件?
    js数据结构-链表
    前端开发中的Error以及异常捕获
    vue-router和webpack懒加载,页面性能优化篇
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/3923201.html
Copyright © 2011-2022 走看看