为什么(i++)不能做左值,而(++i)可以

转载 2015年07月08日 18:37:18

算下来已经很久以前了,大概有那么几个星期了吧。看到了帖子上有人问为什么下面的语句的对错原因

int i = 0;

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

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

看到上面的语句,当时以为两个都是是对的啊,可是当我用VS2010的编译器试了试之后,才发现第一个取地址确实是错误的语句,具体的提示是:error C2102: “&”要求左值,而第二个取地址是正确的。

也就是说取地址符"&"作用的对象必须是一个左值,左值的概念是什么呢?看一下百度对于C/C++中左值的定义:

左值:

C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。左值表示存储在计算机内存的对象,而不是常量或计算的结果。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。简单来说就是,左值相当于地址值,右值相当于数据值


看完左值的定义就不难理解为什么取地址运算符需要作用在一个左值对象上了。可为什么i++与++i有如此的区别呢?

原因是:i++不是存储在x中的值,他们的具体函数实现请看下面:


// 前缀形式:
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
  *this += 1;  // 增加
  return *this;  // 取回值

}


//后缀形式:
const int int::operator++(int) //函数返回值是一个非左值型的,与前缀形式的差别所在。
{//函数带参,说明有另外的空间开辟
  int oldValue = *this;  // 取回值
  ++(*this);  // 增加
  return oldValue;  // 返回被取回的值

}

为什么(i++)不能做左值,而(++i)可以

算下来已经很久以前了,大概有那么几个星期了吧。看到了帖子上有人问为什么下面的语句的对错原因 int i = 0; int *ip = &(i++); //错误 int *ip = &(++i...
  • ZLhy_
  • ZLhy_
  • 2012年12月26日 16:25
  • 7512

9i 卸载不能重装问题

  • 2009年02月10日 11:53
  • 2KB
  • 下载

I/O性能分析-对问题的分析不能只看表象

0x01 缘由      最近,生产环境下出现了一些事故,系统宕机。随之大家开始重视运维,最近发布版本程序后,系统集成部对一进程I/O进行了报警,说程序I/O占用99%,如下图:          ...

关于单片机I/0口置低的引脚不能拉高的问题

平时没注意单片机的I/0结构,以为软件置0的端口,加个外部高电平就可以拉高,下次采样的时候,就成了高电平了。现在看了一下P口结构才知道,不行。P0口做通信用,输出用时,必须外部加上拉电阻,拉高到电源,...

IBM数据集T10I4D100K(带效用值)

  • 2016年05月03日 16:21
  • 8.63MB
  • 下载

自己i做的Hibernatejar包

  • 2013年12月26日 23:07
  • 2KB
  • 下载

OpenCV I_08用滑动条做调色板

目标 • 学会把滑动条绑定到 OpenCV 的窗口 • 你将会学习这些函数:cv2.getTrackbarPos(),cv2.creatTrackbar() 等。 代码示例 ...

用DIO 做的I2C程式

  • 2010年09月17日 15:55
  • 420KB
  • 下载

突发奇想,自己做一个加密芯片,用51单片机做i2c从设备

具体代码:http://download.csdn.net/detail/dragon101788/5571493 研究i2c有一段时间了,这一次自己做了个加密芯片,硬件环境如要使用stc12c5a6...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么(i++)不能做左值,而(++i)可以
举报原因:
原因补充:

(最多只允许输入30个字)