• Chapter4:表达式


    • 左值和右值

    当一个对象被用作右值的时候,用的是对象的值(内容),当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

    一个重要的原则是需要右值的地方可以用左值来代替,但是不能把右值当作左值使用。(13.6有例外情况)

    下面是集中用到左值的情况:

    1.赋值运算符需要一个(非常量)左值作为其左侧运算对象,得到的结果依然是一个左值;

    2.取地址符作用于一个左值运算对象,返回一个指针,此指针是一个右值;

    3.内置解引用运算符、下标运算符、迭代器解引用运算符的求值结果是左值;

    4.内置类型和迭代器的递增递减运算符作用于左值运算对象,其前置版本所得的结果是左值;

    ps.decltype作用于求值结果是左值的表达式得到的是一个引用类型。

    • 除法与求余:算术运算符的运算对象和求值结果都是右值

    C++11新标准规定商一律向0取整(即直接切除小数部分)。

    m%n的结果是m-(m/n)*n

    逻辑和关系运算符的返回值是bool类型。其中,逻辑与和逻辑或都是短路求值。

    赋值运算符的结果是它的左侧运算对象,并且是一个左值。结果的类型是左侧运算对象的类型。

    赋值运算满足右结合律。

    • 递增和递减运算符

    有两种形式:前置版本和后置版本。前置版本将对象本身作为左值返回,后置版本则将对象原始值的副本作为右值返回。

    建议:除非必须,否则不用递增递减运算符的后置版本。

    //经验
    //后置递增运算符优先级高于解引用运算符
    cout << *iter++<<endl;
    • sizeof运算符满足右结合律

    对数组执行sizeof运算得到整个数组所占空间的大小,等价于对数组中所有元素各执行一次sizeof并将所得结果求和。

    对string对象或vector对象执行sizeof运算,只返回该类型固定部分的大小;

    逗号运算符的结果是右侧表达式的值。如果右侧运算对象是左值,那么最终的求值结果也是左值。

    • 类型转换:

    1.整数提升:把小整数类型提升为大整数类型;

    2.无符号类型:无符号类型 op 带符号类型:如果(unsigned≥signed),那么带符号对象转换成无符号对象;如果(unsigned<signed),转换的结果依赖于机器,如果unsigned的所有值可以放到signed类型中,那无符号对象转换成有符号对象;否则,带符号对象转换成无符号对象;

    3.数组转换成指针:在大多数用到数组的表达式中,数组自动传换成指针;

    • 显示转换:

    static_cast:任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

    const_cast:只能改变运算对象的底层const。

  • 相关阅读:
    Knowledge point
    Nagios详解(基础、安装、配置文件解析及监控实例)
    配置网络yum源
    springsecurity整合springboot实现简单认证授权
    使用openssl生成rsa密钥对
    springsecurity实现记住我功能
    springsecurity生成图形验证码并校验
    springsecurity开发基于表单的认证--个性化用户认证流程
    springSecurity自定义用户认证逻辑
    关于JWT分析的文章转载
  • 原文地址:https://www.cnblogs.com/wangyanphp/p/5771159.html
Copyright © 2020-2023  润新知