zoukankan      html  css  js  c++  java
  • (C++)关于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+1;
    return tmp;
    }
    
    // ++i:
    {
    i=i+1;
    return i;
    }
    

    参考文章:

    http://blog.csdn.net/zlhy_/article/details/8349300

      

  • 相关阅读:
    VS2015 C#取消最大化按钮,设置鼠标不可调整窗体大小
    C++调用C#编写的DLL【转】
    C#封装成DLL,并在C#中调用
    ubuntu永久修改主机名
    Anaconda3的安装和汉化
    windows下面安装Python和pip教程
    pip install bs4安装失败
    Sublime text 3中文汉化教程
    Vmware安装ubuntu详细教程
    Sublime text3修改tab键为缩进为四个空格
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4550457.html
Copyright © 2011-2022 走看看