在C、C++等编程语言中都会存在i++,++i,在实际运用中我们总能记住一句话==i++(后置++)是先使用在+1,而++i(前置++)是先自增再使用==。但是在一些很烧脑的场合,这种规律就会“失效”。
本文会首先简单的介绍下前置和后置++在一些场合的实际应用,可以看到的是合理的使用++会使得代码简洁不少。
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);
}
}
运行结果如下:
[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++)是先进行赋值再进行++操作==
最近在网上看到这样一个题,本文的主要目的是这道题。
朋友在面试的时候遇到了一道题,然后我们一起交流的时候,他把这道题给我说了下,结果我也做错了.所以在此记录下:
题是这样的:
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);
}
}
答案出乎我的意料:
0
0
100
不需要去看编译后的字节码,其实很简单的就可以看出来:
分析:
在分析之前我们还是先看一个这样的代码:
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.
–操作符同理,其实细致点这个问题是可以看出来的,还是需要修炼基本功呀···