zoukankan      html  css  js  c++  java
  • 读书笔记:C++ Primer系列(11)—— 表达式

    定义: 表达式(expression)是由一个或多个操作数(operand)通过操作符(operator)组合而成。

    1. 操作符——除法(/)和求模(%)

    注意:

    • 除法和求模两种运算,操作数都必须是整型,包括:bool、char、short、int和long类型,以及对应的unsigned类型
    • 如果两个操作数为正,除法和求模操作的结果也是正数或为零;
    • 如果两个操作数为负,除法操作的结果为正数或为零,而求模的结果为负数或为零;
    • 如果两个操作数,一个为正一个为负,除法和求模的结果取决于机器;如果求模的结果随分子的符号,则向零一侧取整,如果求模的结果随分母的符号,则向负无穷一侧取整。

    举例说明:

    21/6;  //ok,result is 3

    21 / 7; //ok,result is 3

    -21 / -8; //ok,result is 2

    21 / -5; //machine-dependent: result is -4 or -5

    21%6;  //ok,result is 3

    21%7;//ok,result is 0

    -21 % -8; //ok,result is -5

    21 % -5; //machine-dependent: result is 1 or -4

    2. 位操作符

    如:unsigned char b1=01100101

         unsigned char b2=10101111

    求反(~):b3=~b1;  //ok,result is 10011010

    左移(<<):b4=b1<<2; //ok, result is 10010100

    右移(>>):b5=b1>>3; //ok,result is 00001100

    位与(&):b6=b1 & b2; //ok,result is 00100101(对应位都为1时,位与结果为1,其余都为0)

    位或(|):b7=b1 | b2; //ok,result is 11101111(对应位有一个为1,位或结果就为1,其余都为0)

    位异或(^):b8=b1 ^ b2; //ok, result is 11001010(对应位有且仅有一个为1,位异或结果就为1,其余都为0)

    3. sizeof操作符

    sizeof操作符的作用是返回对象或类型名的长度,返回值的类型为size_t,长度的单位是字节。

    注意:

    • 对char类型或值为char类型的表达式做sizeof操作,结果为1;
    • 对引用类型做sizeof操作将返回存放此引用类型对象所需的内存空间大小;
    • 对指针做sizeof操作将返回存放指针所需的内存大小,如果要获取该指针所指向的对象的大小,必须对该指针进行解引用;
    • 对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘以数组元素的个数。这里由于sizeof返回整个数组在内存中的存储长度,因此可以用sizeof数组的结果除以sizeof其元素类型的结果来表示数组元素的个数。

    4. new和delete表达式——可以动态创建和释放数组,也可以动态创建和释放对象

    定义变量时,必须指定其数据类型和名字,而动态创建对象时,只需指定其数据类型,不必为该对象命名,取而代之的是,new表达式返回指向新创建对象的指针。如:

    int i;  //定义了一个整型变量,名字为i,但并未初始化

    int *pInt = new int; //该new表达式在自由存储区分配创建了一个整型对象,并返回此对象的地址,并用返回的地址初始化指针pInt,但创建的对象并未初始化

    • 动态创建对象的初始化——显式初始化

    注:C++可直接初始化动态创建的对象,如果提供了初值,new表达式分配到所需的内存后,用给定的初值初始化该内存空间。如:

    int i(1024); //定义了一个整型变量,变量名为i,并初始化该变量值为1024

    int *pInt = new int(1024); //new动态创建了一个整型对象,该对象被初始化为1024,而指针pInt就指向该对象

    string s(10, '1'); //定义了一个字符串s,并初始化该字符串为10个1

    string *pStr = new string(10, '1'); //new动态创建了一个字符串对象,该对象初始化为10个1,同时指针pStr指向该对象

    • 动态创建对象的默认初始化

    如果不提供显式初始化,则动态创建的对象与在函数内定义的变量初始化方式相同:对于类类型的对象,用该类的默认构造函数初始化,而对于内置类型的对象则无初始化。

    例如:

    string *pStr = new string; //新创建的对象初始化为空字符串

    int *pInt = new int; //整型为内置类型,故新创建的整型对象无初始化

    此情况下,我们可以认为初始化,如下:

    string *pStr = new string(); //初始化为空字符串

    int *pInt = new int(); //pInt指向一个初始化为0的整型对象

    •  内存耗尽

    虽然现在的机器内存容量越来越大,但是自由存储区总有耗尽的时候。如果程序占用了所有可用的的内存空间,new表达式就会失败;

    如果new表达式无法获得所需要的内存空间,系统就会抛出名为bad_alloc的异常。

    • 撤销动态创建的对象

    为防止内存耗尽,我们应在动态创建的对象用完后,显式的将该对象所占据的内存空间返回给自由存储区——用delete来操作

    如:delete pInt; //该语句释放pInt所指向的int型对象所占用的内存空间。

    注:在执行完上述语句后,pInt变成了没有定义,但在很多机器上,尽管pInt没有定义,仍然存放了其之前所指向对象的地址,然而pInt所指向的内存已经被释放,因此pInt不再有效。

    注:delete 指针后,该指针就变成了悬垂指针。悬垂指针指向其之前存放对象的内存,但该对象已经不再存在。这样的指针很容易引起程序出错,而且很难检测出来,因此,一旦删除了指针所指向的对象,应立即将指针置为0,这样就很清除的表明该指针不再指向任何对象。

    • const对象的动态分配和回收

    注:动态创建的const对象必须在创建时初始化,并且一旦初始化,其值就不能被修改

    const int *pInt = new const int(1024);  //new表达式返回指向整型const对象的指针,由于返回的地址存放的是const对象,因此该地址只能赋值给指向const的指针。

  • 相关阅读:
    jmeter响应结果乱码问题
    JMeter 脚本请求错误 HTTP Status 415 的解决
    使用fiddler进行genymotion安卓虚拟机手机抓包
    Android模拟器Genymotion安装使用教程详解
    java基础-数组
    Qt类继承图
    Linux-磁盘管理小结
    User and User Groups in Linux
    Qt5.3编译错误——call of overloaded ‘max(int int)’is ambiguous
    i++ and ++i efficiency
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3696809.html
Copyright © 2011-2022 走看看