zoukankan      html  css  js  c++  java
  • 关于++i和i++的左值、右值问题

    1、什么是左值和右值?

    左值就是出现在表达式左边的值(等号左边),可以被改变,他是存储数据值的那块内存的地址,也称为变量的地址;

    右值是指存储在某内存地址中的数据,也称为变量的数据。

    左值可以作为右值,但右值不可以是左值。

    因此也只有左值才能被取地址。

    2、举两个问题:

    int i = 0;

    (i++)+=i; //错误

    (++i)+=i; //正确 

    int *ip = &(i++); //错误

    int *ip = &(++i); //正确

    3、为什么i++不能作左值?

    我们来看++i和i++的实现就明白了。

    // 前缀形式:
    int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
    {//函数本身无参,意味着是在自身空间内增加1的
      *this += 1;  // 增加
      return *this;  // 取回值
    }
    
    //后缀形式:
    const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
    {//函数带参,说明有另外的空间开辟
      int oldValue = *this;  // 取回值
      ++(*this);  // 增加
      return oldValue;  // 返回被取回的值
    }

    简单得到理解,就是i++返回的是一个临时变量,函数返回后不能被寻址得到,它只是一个数据值,而非地址,因此不能作为左值。

    更简单的代码解释:

    // i++:
    {
    int tmp;
    tmp=i;
    i=i+1return tmp;
    }
     
    // ++i:
    {
    i=i+1;
    return i;
    }

    原文地址:https://www.cnblogs.com/AndyJee/p/4550457.html

  • 相关阅读:
    装饰器函数
    二分查找
    jmter 二次开发 IDEA 项目5.1
    python 测试框架nose
    pycharm 参数、快捷键、调试模式
    IDea 工具debug模式详细使用说明
    MySQL zip安装
    adb 设备命令
    兰亭集序 王羲之
    adb 命令实用
  • 原文地址:https://www.cnblogs.com/nanqiang/p/9979059.html
Copyright © 2011-2022 走看看