0

単純なデータ型の変数を関数の引数として渡し、値を変更できる場合に注意する必要があるのは、PHP と C++ の 2 つだけですか?

そのような

$count = 2;
foo($count);
echo $count;

そして3行目、echo $countは2以外のものを表示します。それが発生する可能性があるのはPHPとC ++だけです。他に起こりうる場所はありますか?

更新:つまり、「値渡し」のように見えるものは、実際には「参照渡し」です。Java、Perl、PHP、Python、および Ruby でオブジェクトを渡す場合、自動的に参照渡しになり、オブジェクトのインスタンス変数の値を変更できます。非オブジェクトを渡すのはどうですか?

4

4 に答える 4

1

Perl、Fortran、Pascal、Visual Basic など、他の多くの言語がこのような「参照渡し」をサポートしています。

あなたが気にかけているものは、まあ、私たちが言うのは難しいです!-)

編集: あなたの更新では、Java と Python を同じカテゴリに入れましたが、それは間違っています: (Java) で例を再現できませんでした:

  int count = 2;
  whatever(count);
  /* count here is CERTAIN to be still 2 */

または (Python):

count = 2
whatever(count)
# count here is CERTAIN to be still 2

Python と Java のスタイルは、(「変数参照」ではなく)「オブジェクト参照による」と呼ばれることもあります。渡される (または割り当てられる) ものは、オブジェクトへの参照です (したがって、オブジェクトにミューテーターがある場合、呼び出し先はそれらのミューテーターを呼び出して、したがって、オブジェクトを変更します)、「変数」ではありません (呼び出し後、引数を渡すために使用される変数があれば、同じオブジェクトを参照し、別のオブジェクトを参照することはありません)。この区別は、(Java と Python の両方で) 数値や文字列などの不変オブジェクトで最も明確にわかります。

于 2009-06-02T01:38:12.660 に答える
1

参照として明示的に定義しない限り、C++ で変数を変更することはできません。通常の (非参照) 引数がある場合、それらはコピーであり、変更できません。API を読んで理解していれば、単純なデータ型の変数を関数の引数として渡すことに注意する必要はありません。

void func(type & arg);

変更可能で、

void func(type arg);

できません。通常、C++ では、API が最初に値を変更する必要がない限り、参照引数にはなりません (出力パラメーター)。

また、Alex が既に述べたように、参照による受け渡しのイディオムをサポートする言語は多数あります。

変数がまたは参照によって渡されるかどうかが言語によって明確にされていない場合にのみ、注意する必要があります。

于 2009-06-02T01:41:44.307 に答える
0

昔は、FORTRANは参照によって定数を渡していました。定数2をサブルーチンに渡すことができ、サブルーチンはそれに3を割り当てることができます。その後、戻った後、このコード

x = 2 + 2

xを6に設定します。最近のFORTRANコンパイラがそれを可能にするかどうかはわかりません。

于 2009-06-02T03:47:11.197 に答える
0

上記の議論に続いて、最近、プログラミング言語の設計では「参照渡し」という用語の使用がかなり厳密であることがわかりました。

プリミティブを値で渡すか (誰にでもわかると思いますが)、オブジェクトへの参照を値で渡します。わかりましたが、次の perl コードを検討してください。

sub addFoo {
  my ($arrayRef) = @_;
  push @{$arrayRef},"foo"; 
}

my @array = (1,2,3);
my $arrayRef; # FUTURE reference (equivalent to pointer C) to @array.

addFoo($arrayref = \@array); #1.
addFoo(\@array); #2.
addFoo($arrayRef); #3.

print join(" ",@array),"\n"; # result "1 2 3 foo foo foo\n";

私の質問は、addFoo への 3 つの代替呼び出しのうち、参照渡しではなく参照渡しと見なされるのはどれですか? 3番については答えは明らかなようですが、1番についてはなんとも言えません。#2。まったく同じことをしています。少なくとも数字の 2 は、一部の perl man ページや Web サイトでは明示的に参照渡しと見なされています。

于 2009-06-07T02:29:39.493 に答える