Java基本概念之i++与++i的区别
in Java with 0 comment
Read: 422

Java基本概念之i++与++i的区别

in Java with 0 comment

i ++ 和 ++ i 使用的不同点在于一个是程序完毕后自增,一个是程序开始前自增

引文


分割线内容来自:知乎
地址:https://www.zhihu.com/question/19811087

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;  // 返回被取回的值
}

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

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

正文

example Ⅰ

两者的区别是:前者是先赋值,然后再自增;后者是先自增,后赋值

example Ⅱ

public class Test2 {
    public static void main(String[] args) {

        int i = 0;
        i = i++ + ++i;

        int j = 0;
        j = ++j + j++ + j++ + j++;

        int k = 0;
        k = k++ + k++ + k++ + ++k;

        int h = 0;
        h = ++h + ++h;

        int p1 = 0, p2 = 0;
        int q1 = 0, q2 = 0;
        q1 = ++p1;
        q2 = p2++;

        System.out.println("i=" + i);
        System.out.println("j=" + j);
        System.out.println("k=" + k);
        System.out.println("h=" + h);
        System.out.println("p1=" + p1);
        System.out.println("p2=" + p2);
        System.out.println("q1=" + q1);
        System.out.println("q2=" + q2);

    }
}

在这里感谢QianQian的耐心指导(≧∇≦)

第一个:

 int i = 0;
 i = i++ + ++i; 

我们的i++ 我们的i先去引用(显示输出的值),然后去递增 则 i = 0 + ++i
然后执行++i 则先去拿到上一个的值为1 ,然后去执行 ++ i ,则 i = 0+ 2 = 2

第二个:

  int j = 0;
  j = ++j + j++ + j++ + j++;

j = (++j) + (j++) + (j++) +(j++)

j = 1 + (j++) + (j++) + (j++)
j = 1 + 1 + (j++) + (j++) //j++先引用,再递增 ,引用后值为1 ,递增后值为2 ,引用用于输出
j = 1 + 1 + 2 + (j++) //这个时候j=2 ,然后去引用值为2 ,递增后为3
j = 1 + 1 + 2 + 3
j = 7

第三个:

 int k = 0;
 k = k++ + k++ + k++ + ++k;

k = (k++) + (k++) + (k++) + (++k)

k = 0 + (k++) + (k++) + (++k) //引用初值为0 ,递增后为1
k = 0 + 1 + (k++) + (++k) //引用递增后的值为1 ,递增后为2
k = 0 + 1 + 2 + (++k) //引用递增后的值为2 ,递增后为3
k = 0 + 1 + 2 + 4 // 递增后为4 ,在引用为4
k = 7

第四个:

  int h = 0;
  h = ++h + ++h;

h = (++h) + (++h)

h = 1 + (++h) //先递增值为1 ,在引用值为1
h = 1 + 2 //先递增2 ,在引用为2
h = 3

第四个:

  int p1 = 0, p2 = 0;
  int q1 = 0, q2 = 0;
  q1 = ++p1;
  q2 = p2++;

q1 = ++ p1 //先递增,然后在引用 p1 = 1 q1 = p1 = 1
q1 = 1

q2 = p2++ //先引用,在递增 q2 = 0 p2 = 1
q2 = 0

Responses