天天看点

Java中的前置++和后置++的理解前言++前置后置的实际使用一道很烧脑的题总结

前言

在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 = ;
        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 = ;
        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= 
        Dennis Ritchie
        after operation···
        i= 
postposition ++
        before operation···
        i= 
        Bjarne Stroustrup
        after operation···
        i= 

Process finished with exit code 
           

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

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

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

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

一道很烧脑的题

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

题是这样的:

package com.dimple.javabase;

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

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

    }
}
           

答案出乎我的意料:

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

分析:

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

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=;
         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.

总结

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