2017-09-11 5 views
0

Javaが値渡しで、一般的なスワップ関数が2つの値を入れ替えることはありません。私は、プリミティブ型の値を入れ替えることは不可能だとも読んでいます。私はなぜ次のプログラムが動作し、スワップ後に異なる金額を表示するのだろうと思っていますか?プログラムでJavaのスワップ関数を理解する

public class swapMe { 

    public static void main(String[] args) { 
     int x = 10 , y = 20; 

     System.out.println("Before"); 
     System.out.println("First number = " + x); 
     System.out.println("Second number = " + y); 

     int temp = x; 
     x = y; 
     y = temp; 

     System.out.println("After"); 
     System.out.println("First number = " + x); 
     System.out.println("Second number = " + y); 
    } 
} 

が、それはどこか似ているが、x = 10y = 20の元の値は、まだどこかに保存され、表示されたスワップ値が正しくありませんか?お知らせ下さい。ありがとう

+2

(手のひらを顔に当てる!)あなたは***理論を交換しません***スワップ機能をチェックするために、任意の方法にそれらの値を渡しています? –

+0

'int temp = x;の後に' temp'に格納された 'x'の値が実行されます。等々。彼らは "どこか"ではなく、コンパイラに自分がどこにあるべきかを正確に伝えました。 –

+0

リテラル**スワップ**と変数間の値の交換との違いを理解する必要があります。さらに、 "* Javaが値渡し*ということをオンラインで読んだので、あなたの例の中のどのメソッドにも変数を渡すことはできませんでした。 – Fureeish

答えて

3

ない完全にその情報を取得しているが、一度に1つを取ってみましょう。

Javaは値渡しで、一般的なスワップ関数は2つの値を入れ替えないことをオンラインで読んでいます。正しい

...スワップの期待がメソッドを呼び出すことによって起こるのであれば。不正

public void swap(int x, int y) { 
    int tmp = x; 
    x = y; 
    y = tmp; 
} 

// meanwhile, in main 
int x = 10; 
int y = 20; 
swap(x, y); 
System.out.println(x); // still prints 10 
System.out.println(y); // still prints 20 

...スワップは、内部メソッドを発生し、何らかの方法で利用されている場合。

public void swap(int x, int y) { 
    int tmp = x; 
    x = y; 
    y = tmp; 
    System.out.println(x); // will print 20 from main 
    System.out.println(y); // will print 10 from main 
} 

// meanwhile, in main 
int x = 10; 
int y = 20; 
swap(x, y); 
System.out.println(x); // still prints 10 
System.out.println(y); // still prints 20 

私はまた、プリミティブ型の値を交換することはできませんことをお読みください。

いいえ、これは完全に可能です。変数はいつでも再割り当てできます。

上記の例がうまくいかない理由は、その変数のいずれかを再割り当てしている間に値の1つを保持しているためです。あなたは基本的に、あなたがそれをコピーしている間に一方の価値を側に置いています。ゆっくり

...

int x = 10; 
int y = 20; 
int tmp = x; // tmp = 10 
x = y; // x = 20, tmp = 10 
y = tmp; x = 20, y = 10; tmp = 10 (but that doesn't matter) 
+0

" 4 "は技術的に"あなたはそれをする。 OPはちょうどスワッピングと割り当てを混乱させる。 –

+0

@ M.Prokhorov:これは中間変数を必要としないPythonのスワッピングスタイルと似ていませんが、このコンテキストで使用するとスワップするのに合っています。 – Makoto

+0

私はPythonも第3の変数を使用していると確信しています。 –