为什么(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 =...
  • u010556473
  • u010556473
  • 2015年05月21日 22:35
  • 227

i++与++i作为左值

#include using namespace std; int main() {  int i = 9;  //i++ = 10;   ++i = 10;  return 0; ...
  • djb100316878
  • djb100316878
  • 2014年11月16日 15:31
  • 1339

a++为什么不能作为左值?

1)首先说左值和右值的定义: 变量和文字常量都有存储区,并且有相关的类型。区别在于变量是可寻址的(addressable)对于每一个变量都有两个值与其相联: 1).它的数据值,存储在某个内存地...
  • wangwei890702
  • wangwei890702
  • 2014年03月01日 11:53
  • 2778

i = i++ 之后 i 的值为什么是 0

运行 i=i++ 之后,打印出 0为什么呢?
  • ruangong1203
  • ruangong1203
  • 2016年01月09日 22:37
  • 1671

为什么i++不能作为左值

今天Mayuyu带大家一起来搞清楚i++与++i的区别。或许你在C++编程中经常使用它们,但是却不知道它们背后的原 理。同样Mayuyu也不知道,那么今天很有必要搞清楚它们。现在就让Mayuyu带领大...
  • ACHelloWorld
  • ACHelloWorld
  • 2014年06月05日 15:12
  • 935

C语言 a++为什么不能作为左值?

摘自:http://blog.csdn.net/wangwei890702/article/details/20210241 1)首先说左值和右值的定义: 变量和文字常量都有存储区,并且有相关...
  • JCRunner
  • JCRunner
  • 2015年03月22日 17:38
  • 880

为什么++i可以作为左值,i++不能作为左值,针对int

(1)首先说左值和右值的定义: 变量和文字常量都有存储区,并且有相关的类型。区别在于变量是可寻址的(addressable)对于每一个变量都有两个值与其相联: 1).它的数据值,存储在某个内存地址...
  • your8686
  • your8686
  • 2012年06月07日 16:19
  • 828

java中i=i++ 值无变化原因详解

想要弄明白JAVA中i=i++没变化的原因,就要了解JAVA虚拟机的”栈“先进后出的运行机制以下面的代码为例:public class AddOperatorTest{ public static v...
  • xulei_19850322
  • xulei_19850322
  • 2010年04月05日 14:52
  • 3116

深入理解Java中的i++、++i语句

在几乎所有的命令式编程语言中,必然都会有i++和++i这种语法。在编程启蒙教材《C语言程序设计》一书中,也专门解释了这两条语句的区别。有些语言中i++和++i既可以作为左值又可以作为右值,笔者专门测试...
  • xialei199023
  • xialei199023
  • 2017年07月30日 14:36
  • 972

for循环中i++与++i的效率探究

for(int i=0;i 我们经常会使用这样的代码来做循环,一般在for循环中习惯于使用i++,却很少使用++i。虽然从代码执行的效果来看,它们并无任何区别,但是它们所生成的代码是有有所不同的。 i...
  • zy1691
  • zy1691
  • 2009年11月21日 23:50
  • 17039
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么(i++)不能做左值,而(++i)可以
举报原因:
原因补充:

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