C++Primer再读读书笔记:第五章

一、算术操作符


       一元操作符优先级别最高,其次是乘、除操作,接着是二元的加、减法操作。当操作符的优先级一样时,一般是从左到右依次与操作数结合。
如果两个操作数为正,除数(/)和求模(%)操作的结果也是正数(或零),如果两个操作数都是负数,除法操作的结果为正数(或零),求模操作的结果则为负数(或零)。如果只有一个操作数为负数,这两种操作的结果(求模结果)取决于机器,除法操作的值则是负数或者零。

二、关系操作符和逻辑操作符


       

逻辑与和逻辑或操作符总是先计算其左操作数,然后再计算其右操作数。只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数。称为:短路求值。

三、位操作符


       位操作符将其整形操作数视为二进制位的集合,为每一位提供检验和设置的功能。
      1、对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以强烈建议使用unsigned整型操作数。
      2、常犯的错误是把位与操作(&)和逻辑与操作(&&)混淆。同样的为或操作(|)和逻辑或操作(||)也容易混淆。

四、赋值操作符


      赋值操作符的左操作数必须是非const的左值。
       int i,j.ival;
       const int ci = i;
       1024 = ival;          //error
       i+j = val;              //error
       ci = ival;               //error
       数组名是不可修改的左值:因此数组不可用作赋值操作的目标,而下标和解引用操作符都返回左值。当将这两种操作用于非const数组时,其结果可作为赋值操作的左操作数。
        int ia[10];
        ia[0] = 1;    //ok
        *ia = 1;      //ok
        1、赋值操作符具有低优先级
        int i=get_value();
        while((i=get_value())  != 42)
         {
              i = get_value();
         }
         在赋值操作上加括号是必须的,因为赋值操作符的优先级低于不等操作符。

五、自增和自减操作符


       1、在必要时才使用后置操作符
        因为前置操作需要做的工作更少,只需要加1返回加1的结果显示,而后置操作符必须西安保存操作数原来的值,以便返回未加1之前的值作为操作的结果。
        2、在单个表达式中组合使用解引用和自增操作
        vector<int>::iterator iter = ivec.begin();
        while(iter != ivec.end())
             cout<<*iter++<<endl;
        *iter++怎么算???? 由于后自增操作优先于解引用操作,所以是*(iter++),自表达式iter++使iter
加1,然后返回iter原值的副本。
         

六、sizeof操作符


       sizeof操作符的作用是返回一个对象或者类型名的长度。返回值的类型是size_t,sizeof表达式的结果是编译时常量、

七、优先级



    一个表达式中,不要在两个或者更多的子表达式中对同一个对象做自增货自减操作
    if(ia[index++] < ia[index]) //次表达式的行为就没有明确意义,在<操作符的左右都有index变量,但是这个先算左边还是右边这个是不定的,假的初始值index 为0就会出现两种状况:
    if(ia[0] < ia[0])  // 右边的先
    if(ia[0] < ia[1])  //左边先
    该表达式最好这样写:
     if(ia[index] < ia[index+1]){}
     index++;

八、new和delete表达式


    1、动态创建对象的初始化
    int  i(1024);
    int *pi = new int (1024);
    int s(10,'s');
    int *ps = new string(10,'s');
    如果提供了初值,new表达式分配到所需要的内存后,用给定的初值初始化该内存空间,如果不提供显示初始值,动态创建的对象与在函数内定义的变量初始化方式相同,对于类类型的对象,用该类的默认构造函数,内置类型的对象则无初始化。
    2、撤销动态创建的对象
    动态创建对象用完后,必须显示地将该对象占用的内存返回给自由存储区,delete表达式释放指针指向的地址空间。
    如果指针指向不是new分配的内存地址,则在该指针上使用delete是不合法的。
    3、悬垂指针
    悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了! 一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚的表明指针不再指向任何对象。
    4、const对象的动态分配和回收
     动态创建const对象必须在创建时初始化,并且已经初始化就不能再修改。
     const int *pci = new const int(1023) ;
    5、动态内存的管理容易出错
  •  delete指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区,删除动态分配内存失败称为“内存泄漏”
  • 读写已删除的对象,如果删除指针所指向的对象后,将指针置为0值,比如容易检测
  • 对同一内存空间使用两次delete表达式。当两个指针指向同一个动态创建的对象,删除就会发生错误。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

iot-genius

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

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

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

打赏作者

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

抵扣说明:

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

余额充值