关于 i++ 和 ++i 的那点事
这是一篇旧的笔记,今天整理发现的:
i++ 是和 i++都是指自加1,但又有不同的地方:
i++返回的是原来的值,而++i返回的是+1后的值
a = ++i; 相当于 i = i+1; a=i,即先加后赋值 a = i++; 相当于 a = i; i = i+1; 即先赋值后加
i++不能作为左值,而++i可以作为左值。
左值的概念(中文维基百科):
左值是对应内存中有确定存储地址的对象的表达式的值,而右值是所有不是左值的表达式的值。
一般通常认为,左值是可以放到赋值符号左边的变量,但是这不能作为区分左右值的依据,左值和右值最根本的区别在于是否运行取地址&运算符获取对应的内存地址。临时变量是右值。
先挖个坑(大佬的代码验证,但是自己验证有问题,先学波c++先)
int i = 0;
int *p1 = &(++i); //正确
int *p2 = &(i++);//错误
++i = 1; // 正确
i++ = 5; //错误
题目:
int i = 5;
i += ++i;
求i的值;
对于这道题目,java和c运行得出不同的结果:
C语言:
对于c语言来说,结果会是12,因为c语言会把后面++i的值赋值给前面的i之后才发生加法运算。
“C语言没有定义求值顺序,i+=++i 标准的未定义行为 ”
Java:
对于java来说,结果是11,因为java里面的i+=++i,会运算成,i=5+(++i)
Python:
对于python来说,没有i++这个用法,++i里面的+号表示是正号的意思