0
static void increment(int num)
{
    num++;
}

static void Main(string[] args)
{   
    int x = 30;
    Console.WriteLine(x);
    increment(x);
    Console.WriteLine(x);
}

こんにちは、なぜこのコードの結果が3030になるのか疑問に思っていますが、何も変わりませんか?ありがとう!

4

7 に答える 7

4

関数の増分では、パラメーターは参照ではなく値で渡されるためです。

xが変更されたことを確認したい場合は、次のいずれかを実行します。

static int increment (int num)//parameter passed by value, but function now returns an incremented value, not void.
    {
        num++;
        return num;
    }
        static void Main (string[] args)
    {   
        int x=30;

        Console.WriteLine(x);
        x = increment(x);
        Console.WriteLine(x);
    }

また

static void increment (ref int num)//num is passed by ref now
    {
        num++;
    }
        static void Main (string[] args)
    {   
        int x=30;

        Console.WriteLine(x);
        increment(ref x);
        Console.WriteLine(x);
    }
于 2013-03-12T09:07:57.547 に答える
1

その理由は、参照ではなく、intの値が渡されているためです。

増分をaccept(ref int)に変更して呼び出した場合、increment (ref x)それは変更されます

于 2013-03-12T09:07:17.803 に答える
1

あなたの増分方法は本質的に全く何もしません。変更された値は返しません。行は1つnum++インクリメントnumされますが、その後は何も返されません。したがってnum、常に同じになります。refたとえば、キーワードを使用してrefを渡すことができます

static void increment (ref int num)
{
    num++;
}

31これにより、2回目のwriteline呼び出しで表示されるnumの値が変更されます。

于 2013-03-12T09:07:29.770 に答える
0

int値型だからです。参照によって渡されません。値によって渡されます(コピーが作成され、メソッドに渡されます)。したがって、メソッドのnumパラメータを変更しても、呼び出し元のコードincrementの値には影響しません。メソッドで変更されるのは値xのコピーのみです。xincrement

static void increment(int num) // here you have copy of x
{
    num++; // copy is modified
}

static void Main(string[] args)
{   
    int x = 30;
    Console.WriteLine(x);
    increment(x); // x stays here and not passed into method
    Console.WriteLine(x);
}
于 2013-03-12T09:06:58.100 に答える
0

その理由は、参照ではなく値でnum変数を渡したためです。値を渡す場合、変数の値がローカルコピーにコピーされ、ローカルコピーがインクリメントされますが、メソッドの終了後に破棄されます。参照によって変数を渡す場合、変数のアドレスがメソッドに渡され、元の変数が変更されますが、そのコピーは変更されません。

static void increment (ref int num)
    {
        num++;
    }

そして、このメソッドを次のように呼び出します

increment(ref x);

is値型であり、他のすべてのint値型と同様に、キーワードrefが使用されていない場合は常に値によって渡されます。これらとは異なり、クラスタイプは参照として渡され、メソッドでそれらを変更すると元のオブジェクトが変更されます。

于 2013-03-12T09:07:30.440 に答える
0

xはローカルで定義されます。

印刷しようとするConsole.WriteLine(num);increment (int num)

31を印刷します。

于 2013-03-12T09:07:33.163 に答える
0

intは値型であるため、パラメーターをrefとして宣言する必要があります。

static void increment (ref int num)
于 2013-03-12T09:08:30.090 に答える