Javaにおける前置++と後置++の理解

6702 ワード

前言
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++)は先に付与を行ってから++操作を行う==
最近ネットでこのような問題を見て、本文の主な目的はこの問題です.
頭が焼けるような問題
友达は面接の时に1つの问题に出会って、それから私达がいっしょに交流する时、彼はこの问题を私に言って、结果は私も间违っていました.
問題はこうです.
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をj 1、右側のjをj 2(注意、ただ!):1.実行時には、まず等号右側を実行する、つまり=j 1=j 2==という一言で、このような一言で、j 1=0となるでしょう.2.このとき、通常の論理であれば、j++という言葉を実行しているのではないでしょうか.そうですね.j++という言葉が実行されるに違いありません.注意:このj 2++を実行する場合、j 1と同じワークスペースではなく、j 2++が完了した後、受信する変数はありません.j 2++の廃棄を招く.だからjはずっと0です.
まとめ
-オペレータは同じですが、実は細かく見るとこの問題は見えますが、基本的な勉強が必要ですね.