Java中的前置++和后置++的理解

前言

在C、C++等编程语言中都会存在i++,++i,在实际运用中我们总能记住一句话==i++(后置++)是先使用在+1,而++i(前置++)是先自增再使用==。但是在一些很烧脑的场合,这种规律就会“失效”。

本文会首先简单的介绍下前置和后置++在一些场合的实际应用,可以看到的是合理的使用++会使得代码简洁不少。

++前置后置的实际使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.dimple.javabase;

import java.util.Arrays;

/**
* @program: JavaSEProject
* @description: 测试++运算符
* @author: Dimple
* @create: 2018-08-14 16:46
**/
public class AddOpt {

public static void main(String[] args) {
int i = 0;
String[] people = {"Dennis Ritchie", "Bjarne Stroustrup", "James Gosling"};
System.out.println(Arrays.asList(people).toString());
System.out.println("preposition ++");
System.out.println(" before operation···");
System.out.println(" i= "+i);
System.out.println(" "+people[i++]);
System.out.println(" after operation···");
System.out.println(" i= "+i);
System.out.println("postposition ++");
i = 0;
System.out.println(" before operation···");
System.out.println(" i= "+i);
System.out.println(" "+people[++i]);
System.out.println(" after operation···");
System.out.println(" i= "+i);

}
}

运行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Dennis Ritchie, Bjarne Stroustrup, James Gosling]
preposition ++
before operation···
i= 0
Dennis Ritchie
after operation···
i= 1
postposition ++
before operation···
i= 0
Bjarne Stroustrup
after operation···
i= 1

Process finished with exit code 0

上面的都是很基础的,只是单纯的为了回忆一下,所有需要记住的是:

==前置++(++i)是先进行++操作后再赋值==
==后置++(i++)是先进行赋值再进行++操作==

最近在网上看到这样一个题,本文的主要目的是这道题。

一道很烧脑的题

朋友在面试的时候遇到了一道题,然后我们一起交流的时候,他把这道题给我说了下,结果我也做错了.所以在此记录下:

题是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.dimple.javabase;

/**
* @program: JavaSEProject
* @description: 面试题中的一道烧脑题
* @author: Dimple
* @create: 2018-08-14 17:00
**/
public class Increment {
private static int k = 0;
public static void main(String[] args) {
int j=0;
int n=0;
for(int i=0;i<100 ;i++){
j=j++;
k=k++;
n=++n;

}
System.out.println(j);
System.out.println(k);
System.out.println(n);

}
}

答案出乎我的意料:

1
2
3
0
0
100

不需要去看编译后的字节码,其实很简单的就可以看出来:

分析:
在分析之前我们还是先看一个这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.dimple.javabase;

import java.util.Arrays;

/**
* @program: JavaSEProject
* @description: 测试++运算符
* @author: Dimple
* @create: 2018-08-14 16:46
**/
public class AddOpt {

public static void main(String[] args) {
int j=0;
j = j++;
System.out.println(j);
}
}

以上代码如果我们使用的是IDEA编译器的话,在j下面有一个小波浪线提示以下话:

The value changed at ‘j++’ is never used less… (Ctrl+F1)
Inspection info: This inspection points out the cases where a variable value is never used after its assignment, i.e.: - the variable never gets read after assignment OR - the value is always overwritten with another assignment before the next variable read OR - the variable initializer is redundant (for one of the above two reasons)

以上提示说的是:该j变量并没有被使用。emmmmm不是让它=j了吗?以上只是一个小的插曲,接下来开始我们的分析。

首先我们看到==j=j++;==这样的一句话,本身是有问题的(为了说明,我们把表达式左边的j叫做j1,右边的j叫做j2(注意,只是叫做!)):

1. 执行时,首先是会执行等号右边的话,也就是==j1=j2==这一句话,那么这样的一句话,得到的结果是j1=0,对吧。
2. 这个时候如果按照正常的逻辑,那么应该是执行j++这句话了对吧。是这样没错,肯定是会执行j++这一句话的。注意:执行这个j2++的时候,并不和j1在同一个工作区,j2++完了之后,并没有任何的变量去接收它。导致j2++废弃。所以j一直都是0.

总结

–操作符同理,其实细致点这个问题是可以看出来的,还是需要修炼基本功呀···

-------------The End-------------

本文标题:Java中的前置++和后置++的理解

文章作者:Dimple

发布时间:2018年08月14日 - 04:08

最后更新:2018年09月28日 - 17:09

原始链接:http://www.bianxiaofeng.com/2018/08/14/2018-08-14-04-38-57/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

na,给我一个棒棒糖!
0%