开发者社区> 问答> 正文

刚学C++,有些关于自增运算符跟引用赋值的问题,望各位大神帮忙解答一下

#include 
using namespace std;
int main() {
int a = 2;
int c = 2;
int & b = a++;
int & d = ++c;
cout<<a<<","<<b<<endl;
cout<<c<<","<<d<<endl;
}

如上面代码所示,为什么b引用的初始化会编译通不过,d引用的定义确没有提示编译错误?
按我理解
int & b = a++;应该相当于下面两句:
int & b =a;
a=a+1;
所以我觉得编译应该通得过,但实际上不行,所以请各位大神指正一下。

展开
收起
a123456678 2016-03-05 10:14:15 3351 0
4 条回答
写回答
取消 提交回答
  • 这位同学回答的不错 -> a123456678 其实说一句这样写代码有异议性.不ok

    2020-08-03 20:18:36
    赞同 展开评论 打赏
  • 软件开发,安全加密

    非常量引用的初始值必须为左值,i++ 不可以作为左值;
    ++i 可以作为左值。
    int main()
    {

    int i = 9;
    //i++ = 10;
    ++i = 10;
    return 0;
    }

    2019-07-17 18:52:59
    赞同 展开评论 打赏
  • 乐于学习与分析

    非常量引用的初始值必须为左值,i++ 不可以作为左值;
    ++i 可以作为左值。
    int main()
    {

    int i = 9;
    //i++ = 10;
    ++i = 10;
    return 0;
    }

    2019-07-17 18:52:59
    赞同 展开评论 打赏
  • 首先,你需要弄明白c++是如何实现前置自增与后置自增的。
    //前置式,累加后取出

    UPInt& UPInt::operator++()

    {

    *this+=1; //累加

    return *this; //取出

    }

    //后置式,取出后累加

    const UPInt upInt::operator++(int)

    {

    UPInt oldVlaue=*this; //取出

    ++(*this); //累加

    return oldVlaue;

    }

    后置自增,返回的一个局部变量,之后局部变量也就不见了,把一个不存在的内存赋与引用显然不正确。而且返回的值是const,把一个const变量赋值给一个非const引用也是不正确的,在VS2008下把int & b = a++改为const int & b = a++;可以编译通过,但是在下面增加一个语句a+=1;把a与b的值打印出来,它们的值是不相同的,说明b并不是指向a的内存区域,我们可以通过打印出a与b的地址可以看出来。
    前置自增与后置自增显然是不相同的,返回值是一个引用而且是它本身,这样赋值给一个引用当然是可以的。

    2019-07-17 18:52:58
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载