2012-06-08 3 views
0

입니다. 제어기 또는 CPU의 누산기를 통해 리턴이 수행 될 수 없습니다.C의 함수에서 둘 이상의 값을 반환 할 수없는 이유는 무엇입니까? 이유는? 가능한 경우 둘 이상의 값을 반환하는 방법은

올바른 이유가 있습니까?

+0

그게 무슨 뜻입니까? – SLaks

+0

여러 값을 반환하는 데 제한이있는 이유는 무엇입니까? – kapilddit

+0

두 개 이상의 값을 반환하는 것은 무엇을 의미할까요? –

답변

9

이것이 언어 정의 방법입니다. 근본적인 이유는 없습니다. 다른 언어는 여러 값 (예 : Matlab)을 반환 할 수 있습니다.

"해결 방법"으로 여러 필드가 들어있는 구조체를 반환 할 수 있습니다.

+0

포인터를 전달하여 함수에서 수정할 수도 있습니다. –

+0

우리는 변수의 수를 함수에 전달할 수 있고 변수는 스택에 공간을 생성합니다. 그럼 왜 우리는 여러 변수를 반환 할 수 없습니다. 스택 또는 일부 메모리에서 반환되는 경우? – kapilddit

+2

@kapilddit : 언어가 정의 되었기 때문입니다. –

3

구조체에 넣으면 두 개 이상의 항목을 완전히 "반환"하거나 함수에 포인터를 전달하여 함수가 반환 된 후에도 계속 남아있는 값을 쓸 수 있습니다.

1

한 번에 둘 이상의 값을 반환 할 수 없습니다. 함수를 반환하는 구문은 하나의 값만 받아 들여야하는 방식으로 정의되기 때문입니다. 아래의 예를 확인하십시오. 위의 경우

a=returnfunction(); 

returnfunction 함수()는 두 개 이상의 값을 반환하면

는 다음 컴파일러는 변수 (A)에 값을 리턴하는 초기화하는 혼란 얻는다. 함수 returnfunction()이 두 개의 값 1과 2를 반환하면 컴파일러는 값 1 또는 2를 변수 a에 할당하는 것을 혼동합니다. 따라서 이러한 유형의 문제를 방지하기 위해 함수는 둘 이상의 값을 반환하지 않는 방식으로 정의됩니다.

+0

그런 경우 반환 값을 잡기 위해 두 개의 변수를 사용할 수 있습니다. 인수와 마찬가지로 – kapilddit

+0

하지만 여전히 유효합니다. – kapilddit

0

표현 방법과는 반대로 실제로 값은 반환되지 않습니다. 사실 반환 값/주소는 스택에서 함수 호출에 대한 인수로 전달됩니다. 그런 다음 return 문은 실제로 해당 인수를 수정하여 결과를 호출자에게 전달합니다. 어떤 의미에서

, 그것은 거의 같은 void func(arg1, arg2, *ret)

다른 언어가 다른이를 처리합니다. C는 스택에서 하나의 "return"인수 만 예상합니다. 실제로 구조체는 여러 값을 "반환"하게하므로 구조체에 대한 포인터를 일반적인 인수로 전달할 수도 있습니다.

+0

현대의 CPU/ABI가 그게 사실입니까? – Austin

관련 문제