PHP와 C ++는 패스별로 보이는 것에 대해 조심해야 할 유일한 두 곳입니까?

StackOverflow https://stackoverflow.com/questions/937585

문제

PHP와 C ++는 단순한 데이터 유형 변수를 함수 인수로 전달하는 데주의해야 할 유일한 두 곳입니까? 값이 변경 될 수 있습니까?

~와 같은

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

그리고 세 번째 라인, echo $ count는 2가 아닌 다른 것을 표시합니다. 나는 그것이 일어날 수있는 곳에서 PHP와 C ++에 대해서만 알고 있습니다. 일어날 수있는 다른 곳이 있습니까?

업데이트: 즉, "Pass By Value"처럼 보이는 것은 실제로 "Pass By Reference"입니다. Java, Perl, Php, Python 및 Ruby에서 객체를 전달하는 경우 자동으로 회의별로 회의를 갖고 인스턴스 변수의 객체 값을 변경할 수 있습니다. 비 객체를 통과하는 것은 어떻습니까?

도움이 되었습니까?

해결책

다른 많은 언어는 그러한 "Pass by Reference"를 지원합니다 - Perl, Fortran, Pascal, Visual Basic, ...

당신이 관심있는 사람들은 우리가 말하기가 어렵습니다!-)

편집 : 업데이트에서 Java와 Python을 같은 범주에 넣었지만 잘못되었습니다. (Java)로 예제를 재현 할 수 없습니다.

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

또는 (파이썬) :

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

Python과 Java의 스타일은 때때로 "객체 참조로"( "가변 참조에 의한 것"과 반대로)로 알려져 있습니다. 통과 된 것은 (또는 할당 된) 물체에 대한 참조입니다 (따라서 객체에 Mutator가있는 경우 Callee는 그 돌연변이터를 호출 할 수 있습니다. 따라서 객체를 변경하지 않고 "변수"가 아닌 (따라서 인수를 전달하는 데 사용되는 변수가있는 경우, 여전히 다른 객체에 대해서는 동일한 개체를 지칭합니다). 이 차이점은 (자바와 파이썬) 숫자와 문자열과 같은 불변의 물체로 볼 수있는 가장 분명합니다.

다른 팁

C ++의 변수를 변경할 수는 없습니다. 명시 적으로 참조로 정의하십시오. 정기적 인 (비 참조) 인수가있는 경우 사본이며 ~ 아니다 변경됩니다. API를 읽고 이해하면 간단한 데이터 유형 변수를 함수 인수로 전달하는 데주의.

void func(type & arg);

변경할 수 있습니다

void func(type arg);

캔트. API가 처음에 값이 변경되기를 원하지 않는 한 일반적으로 C ++에서는 참조 인수가 아닙니다 (출력 매개 변수).

그리고 Alex는 이미 언급했듯이 참조로 통과하십시오 관용구.

언어가 그렇지 않은 경우에만 조심해야합니다. 분명한 변수가 통과 된 경우 가치에 따라 또는 참조로.

옛날에 Fortran은 기준으로 상수를 통과했습니다. 상수 2를 서브 루틴으로 전달할 수 있으며 서브 루틴은 3을 할당 할 수 있습니다. 그런 다음 반환 후이 코드가 있습니다

x = 2 + 2

x를 6으로 설정합니다. 최신 Fortran 컴파일러가이를 허용하는지 모르겠습니다.

위의 논의에 따라 최근에 나는 "Pass-by-reference"라는 용어의 Y 프로그래밍 언어 설계 사용이 다소 엄격하다는 것을 알게되었으며, 예를 들어 Java에서는 실제로 엄격하게 값을 통과합니다.

둘 중 하나, 당신은 값별로 원시를 전달하거나 (내가 생각한 모든 사람에게 명확하게) 값에 따라 물체에 대한 참조를 전달합니다. 이제 이해하지만 다음 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에 대한 세 가지 대체 호출 중 어느 것이 있는지 제의 질문은 Pass-a-reference와 반대로 통과 회의로 간주됩니까? 3 번은 대답이 명확한 것 같습니다. 그러나 번호 #1에 대해서는 말할 수 없습니다. #2. 정확히 똑같이하고 있습니다. 최소한 2는 일부 Perl Man 페이지 및 웹 사이트에서 회의별로 명시 적으로 간주됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top