課題 (補足)

第九回課題にて、 「交換したい変数を引数として渡す」という方式では 変数の交換はできないということを学び、
それは Java でも C# でも変わらない、ということに触れた。

Java や C# を勉強している学生もいるだろうから、 これらの言語での「正しく機能しない swap」のプログラム例を挙げておく。

[Java による正しく機能しない swap]
public class Swap {
	void swap(int x, int y){
		int tmp = x;
		x = y;
		y = tmp;
	}
	public static void main(String[] args) {
		Swap s = new Swap();
		
		int x = 10;
		int y = 20;
		
		System.out.println("[変更前]");
		System.out.println("x="+x+", y="+y);		

		s.swap(x, y);
		
		System.out.println("[変更後]");
		System.out.println("x="+x+", y="+y);	
	}
}

なお、Java においてはこの「正しく機能しない swap」を正しく機能させる方法は (素直な方法では) 存在しない。
(Integer オブジェクトを渡すとか、無理矢理配列を渡すとかすればできなくもないだろうが)

Java では変更したいものを引数として渡すというよりは、メンバ関数 (メソッド) にてメンバ変数を操作する
と考えるのが素直な方法であろう。

次に C# での正しく機能しない例

[C# による正しく機能しない swap]
namespace Swap_CSharp
{
    class Swap
    {
        void swap(int x, int y)
        {
            int tmp = x;
            x = y;
            y = tmp;
        }

        static void Main(string[] args)
        {
            Swap s;
            s = new Swap();

            int x = 10;
            int y = 20;

            Console.WriteLine("[変更前]");
            Console.WriteLine("x=" + x + ", y=" + y);

            s.swap(x, y);

            Console.WriteLine("[変更後]");
            Console.WriteLine("x=" + x + ", y=" + y);
        }
    }
}

ちなみに、C# にて swap を正しく機能させるためには、以下のように2行に変更を加えるだけでよい。
なぜこれで正しく swap が機能するかを理解するには、やはり今後学ぶポインタの知識が必須だと言える。

// swap 関数の定義部

void swap(ref int x, ref int y)

// swap 関数の呼び出し部

s.swap(ref x, ref y);







非情報系学生のための C/C++ 入門に戻る