2010-11-27 3 views
7

일부 comp-sci 논문과 테스트에서 나는 swap()이 다음과 같이 구현 된 것을 본다 :스왑()이 배열을 전달하여 때때로 구현되는 이유는 무엇입니까?

void swap(int x, int y, int *a) 
{ 
    int t = a[x]; 
    a[x] = a[y]; 
    a[y] = t; 
} 

void swap(int& x, int& y) 
{ 
    int t = x; 
    x = y; 
    y = t; 
} 

처음 두 인수에 대한 배열을 인덱싱하지 않아도 됨으로써 코드 클리너를 호출 할 수 있습니까? 우리가 std :: swap()을 사용해야하기 때문에 그것이 중요한 질문이 아니라는 것을 알았지 만 나는 아직도 궁금하다.

답변

6

모든 프로그래밍 언어가 참조 용 호출을 지원하지는 않습니다. 예를 들어, swap을 수행하는 후자의 방법은 Java에 적용되지 않습니다.

의사 코드가 포함 된 책에는 일반적으로 전달 될 때 배열과 포인터가 복사되지 않고 다른 모든 것은 함수 호출에서 복사된다는 규칙이 있습니다. 앞의 방법은 인수가 전달되는 방식에 대한 특별한 설명이 필요하지 않습니다.

청결도에 관해서 마지막 점에 관해서는별로 다르지 않습니다. 전자의 경우 스왑에 대한 호출은 간단히 : swap(i, j, a);이고 후자에서는 swap(a[i], a[j]);이어야하며 표현식에 대괄호가 있어야합니다.

+1

Java? 프로그래밍 언어입니까? ;) – ybungalobill

+0

Java의 경우에는 참조에 의한 호출뿐만 아니라 지원되지 않는 중위 포인터입니다. 대부분의 (모든?) 가비지 수집 언어는 GC를 처리 할 혼란이 있기 때문에 금지합니다. 이러한 언어는 자연스럽게 질문에서 첫 번째 스 니펫 스타일로 글을 씁니다. –

+1

@Pascal : C#은'ref' 매개 변수를 지원합니다. –

2

두 번째 코드 샘플은 C++가 아니라 C입니다. C++은 참조 매개 변수를 지원하지만 C는 포인터를 통해 간접적으로 참조 만 지원합니다.

두 번째 구현이 더 깨끗하다는 것에 동의합니다. C 언어로 작동하게하려면 각 매개 변수의 &*으로 변경하고 함수 내에서 각각 xy (또한 *)을 참조 해제하십시오.

+0

고마워, 네, 알고 있어요 & C + + 기능입니다. 나는 그것이 순수한 C 사람들에게 호소 할 것이라고 생각했기 때문에 (심지어 존재한다면) 그 질문을위한 태그에 C를 포함시켰다. –

+0

@Fast Fish : 청중을 늘릴 의도로 태그를 포함하지 마십시오. – dmckee

+0

@dmckee, 내가 너를 잘 모르겠다. 필자가 생각하기에 원래 인용 한 논문이 C를 대상으로 한 것이거나 C를 사용했다는 점을 감안할 때 C 프로그래머는 이러한 관행에 대한 통찰력을 제공 할 수있을 것입니다. 잠재 고객을 늘리려면 적합한 대상에게 도달하는 것이 중요합니다. 그것이 당신이 말하고있는 것이라면 독자를 위해서 관객을 늘려는 시도는 없었습니다. –

관련 문제