关于++i和i++

转载 2018年04月17日 20:41:54
作者:叶王
链接:https://www.zhihu.com/question/19811087/answer/80210083
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

i++ 与 ++i 的主要区别有两个:
1、 i++ 返回原来的值,++i 返回加1后的值。
2、 i++ 不能作为左值,而++i 可以。

毫无疑问大家都知道第一点(不清楚的看下下面的实现代码就了然了),我们重点说下第二点。
首先解释下什么是左值(以下两段引用自中文维基百科『右值引用』词条)。
左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。
一般来说,左值是可以放到赋值符号左边的变量。但
能否被赋值不是区分左值与右值的依据。比如,C++的const左值是不可赋值的;而作为临时对象的右值可能允许被赋值。左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。
比如,
int i = 0;
int *p1 = &(++i); //正确
int *p2 = &(i++); //错误

++i = 1; //正确
i++ = 5; //错误

那么为什么『i++ 不能作为左值,而++i 可以』?
看它们各自的实现就一目了然了:
以下代码来自博客:为什么(i++)不能做左值,而(++i)可以
// 前缀形式:
int& int::operator++() //这里返回的是一个引用形式,就是说函数返回值也可以作为一个左值使用
{//函数本身无参,意味着是在自身空间内增加1的
  *this += 1;  // 增加
  return *this;  // 取回值
}

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

(1)如果只是看i++和++i,这两个是等价的,都等同于i=i+1,都是变量自身加1。 (2)在一般情况下,它们都是跟赋值联系在一起。 比如: int a; a=i++;//将i的值赋值给a,即a=i;然后再执行i=i+1; 也就是【a=i++;】与【a=i; i=i+1;】等价。 a=++i;//将i+1的值赋给a,即a=i+1;然后再执行i=i+1; 也就是【a=++i;】与【a=i+1;i=i+1;】等价。

(3)【总结一下】 ①前置++是将自身加1的值赋值给新变量,同时自身也加1; ②后置++是将自身的值赋给新变量,然后才自身加1.
作者:知乎用户 链接:https://www.zhihu.com/question/19811087/answer/83748442 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

如上所示,i++ 最后返回的是一个临时变量,而临时变量是右值

关于 i++ 和 ++i i-- 和 --i 的那些事儿

++、--运算符既可以放在变量之前(如++i、--i),也可放在变量之后(如i++、i--)。两者的差别是放在变量之前,先增加1(或减少1),再取值;放在变量之后,先取值,再增加1(或减少1)。如对于...
  • u014746965
  • u014746965
  • 2015-04-11 13:43:42
  • 1019

关于(i++)与(++i)在计算中的讨论

关于(i++)与(++i)在计算中的讨论,在一般编程时候不要这样用。学校出这种题了可以看一下。...
  • kanamisama0
  • kanamisama0
  • 2016-08-31 22:50:47
  • 620

今天面试时,碰到的经典问题++i与i++

今天去面试,跟面试官说了不到3句话,被面试官以他们不找暑假实习工被拒。站了两个小时的公交的我心里很不爽,旁边有个培训班出来的哥们正在做他们的C语言面试题。我凑过去看了看C语言题目大致如下(我用java...
  • anj24
  • anj24
  • 2017-03-10 18:41:09
  • 311

i++与++i一道简单的题目引发的思考

关于i++和++i的优先级,在i++和++i共存的式子里面,具体怎么算呢? 下面是例题: #include int main() { int a=8; int b; int c; b=...
  • hjf161105
  • hjf161105
  • 2016-11-17 23:27:01
  • 356

OC中 (i++)+i 的值得运算

在OC中,   int i = 3; NSLog(@"%d", (i++)+i);    结果值为7.2015-12-14 08:50:31.972 OC_Test[47...
  • morningCookies
  • morningCookies
  • 2015-12-14 19:57:40
  • 313

很有意思的面试题i++,++i

很有意思的面试题i++,++i如下图 答案 531
  • u012222078
  • u012222078
  • 2017-01-20 20:45:26
  • 434

[C++]关于i++和++i的学习

  [C++]关于i++和++i的学习MoaKap今天在论坛上无意中看到有人问关于i++和++i的问题,感觉自己也不怎么熟悉,就仔细看了一下。感觉有位大侠的回复相当不错,很有特色,把问题讲得很明白,受...
  • ljinddlj
  • ljinddlj
  • 2007-12-10 10:56:00
  • 9554

关于cout中连续i++的执行顺序

[C++]关于i++和++i的学习 MoaKap 今天在论坛上无意中看到有人问关于i++和++i的问题,感觉自己也不怎么熟悉,就仔细看了一下。感觉有位大侠的回复相当不错,很有特色,把问题讲...
  • seumonkey
  • seumonkey
  • 2014-02-26 10:50:22
  • 1616

浅谈java之++i和i++区别

浅谈java之++i和i++区别                   今天简单谈谈关于java的一个误区,相信很多刚开始学习java的朋友都会遇到这个问题,虽然问题很简单,但是经常容易搞混,说说jav...
  • u011747761
  • u011747761
  • 2015-01-09 16:31:05
  • 11578

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

在几乎所有的命令式编程语言中,必然都会有i++和++i这种语法。在编程启蒙教材《C语言程序设计》一书中,也专门解释了这两条语句的区别。有些语言中i++和++i既可以作为左值又可以作为右值,笔者专门测试...
  • xialei199023
  • xialei199023
  • 2017-07-30 14:36:54
  • 1846
收藏助手
不良信息举报
您举报文章:关于++i和i++
举报原因:
原因补充:

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