zoukankan      html  css  js  c++  java
  • 第4章 表达式

    4.1 基础

    左值和右值

    当一个对象被用作左值的时候,使用的是对象的内存空间。当一个对象被用作右值的使用,使用的是对象的内存数值。

    左值的同时,也可以当做右值,从而使用其值。但是右值,不一定能作为左值。

    warming

    赋值运算需要一个左值作为左侧运算对象,同时,也将返回一个左值。

    decltype作用于左值,将返回一个引用类型,比如*p,返回的是左值,decltype(*p)得到是int&类型。decltype作用于右值,将返回一个指针类型,比如&p,返回的是右值,decltype(&p)得到是int**类型。

    4.2 算术运算符(+ - * / %)

    算术运算符按照从左向右的顺序进行组合,是左结合律。

    算术运算符的求职结果是右值。

    算术运算中,非数值需要转换成数值才能参与运算,例如bool值将分别转换为0、1.

    对于%运算符,作用对象应为整数,并满足m=(m/n)*n+m%n。可知,m%n符号与m相同。

    4.3 逻辑和关系运算符(>=<、==、!=、!、&&、||)

    逻辑和关系运算符返回的类型都是布尔类型,运算对象和求值结果都是右值。

    4.4 赋值运算符(=)

    赋值运算符的左侧对象必须是一个可修改的左值。

    赋值运算符返回的是他的左侧运算对象,并且是一个左值。

    赋值运算符满足右结合律。

    赋值运算符运算结果的用处:

    int i;
    while( (i=get_value()) != 42)
        do_something();

    4.5 递增递减(++、--)

    前置,将运算对象递增/减,并返回运算之后的对象,作为左值。后置,将运算对象递增/减,并返回运算之前对象的副本,作为右值。

    因此,如非必要,避免使用后置对象,可以减少产生副本的开销。

    后置的用法:

    auto pbeg = v.begin();
    while(pbeg != v.end() )
        //++优先级高,此处将当前值输出,并将迭代器提升一个位置
        cout<< *pbeg++<<endl;

    4.6 成员访问运算符(->、.)

    ptr->men等价于(*ptr).mem

    4.7 条件运算符(cond ? expr1 : expr2)

    条件运算符使用右结合律,是从右向左组合的。右边的通常是左边的分支。

    4.8 位运算

    ~    按位求反
    <<、>>    移位运算(有时事IO运算)
    &, |    按位与、或
    ^    按位异或

    移位运算满足左结合律。优先级比关系运算、赋值运算、条件运算高,比算术运算低。

    4.9 sizeof运算符

    返回表达式或者类型名字占用的字节数。满足右结合律,所得为size_t类型的常量。有两种形式:

    sizeof(type)
    sizeof expr

    sizeof并不直接计算表达式的值。

    sizeof *p满足右结合律,sizeof和*的优先级相同,因此等价于sizeof(*p)。由于不直接计算表达式的值,所以即使p是一个空指针,仍然可以求值。

    warming

    sizeof对char表达式运算结果为1。

    sizeof对数组运算结果为整个数组占用的字节数。

    sizeof对string和vector只会返回类型固定部分的大小,不返回其所有元素占用空间的大小

    4.10 逗号运算符(,)

    从左向右求值,返回右侧的值。

    4.11 类型转换

    隐式转换

    比int类型小的整型,提升为较大的整型。
    条件中,非布尔值转换成布尔值。初始化中,初始值转换为变量的类型;赋值中,右侧类型转换成左侧类型。
    算术运算、关系运算中,转换成同一种类型进行运算。字节相同,带符号的转换成无符号的。字节不同,转换成字节多的类型。
    函数调用时。

    数组转换成指针。

    回头补充

    编译器每次只会执行一种类类型的转换,但是内置类型的转换和类类型的转换可以一起使用。

    显示转换

    强制类型转换的形式:cast-name<type>(expression)

    补充const int *const p = &value,其中第二个const是顶层,限制p的内存不能更改;第一个const是底层,限制指向的内存不能改。

    static_cast:只要不包含底层const,都可以使用。

    const_cast:只能改变底层const性质,不能改变类型,也就是可以将常量转换为变量。

    reinterpret_cast:提供对内存位模式的重新解释,例如将指向int的指针(int *ip),转换成指向char的指针(reinterpret_cast<char*>(ip) )。

    int x(0x00484848);  //十六进制48,表示H
    int *p=&x;
    char *c=reinterpret_cast<char*>(p);
    cout<< c <<endl;        //输出为:HHH,依赖于机器,此处int的高位是内存中较高的地址。

    dynamic_cast:运行时类型识别。

    旧式强制类型转换

    type(expr)

    (type)expr

     

     

  • 相关阅读:
    UVA 10600 ACM Contest and Blackout(次小生成树)
    UVA 10369
    UVA Live 6437 Power Plant 最小生成树
    UVA 1151 Buy or Build MST(最小生成树)
    UVA 1395 Slim Span 最小生成树
    POJ 1679 The Unique MST 次小生成树
    POJ 1789 Truck History 最小生成树
    POJ 1258 Agri-Net 最小生成树
    ubuntu 用法
    ubuntu 搭建ftp服务器,可以通过浏览器访问,filezilla上传文件等功能
  • 原文地址:https://www.cnblogs.com/qiusuo/p/4477517.html
Copyright © 2011-2022 走看看