귀환 성명

Return statement

컴퓨터 프로그래밍에서 반환 성명서와 순간에 코드에 재개되는 서브 루틴은, 그것의 반환 주소로 알려진 호출 명령 직후 현재 서브 루틴을 떠나기 실행을 유발한다.발송인 주소 호출하는 일에, 오늘날 프로세스의 호출 스택은 보통 또는 레지스터에 저장됩니다.많은 언어에 귀환 명령어 은 반환 값을 현재 함수를 호출한 코드에 전달할 지정 기능할 수 있다.

개요

C와 C++에서,return exp;(어디exp어쩔 수 없는 표현)은 성명을 내고 말해 주는 기능으로 돌아가실행은 그 프로그램을 위해 호출 기능, 그리고 보도하는 가치.exp만약 함수 반환 형식이 없게 된다, 돌아오는 발언은 경우에 프로그램은 현재 기능에서 벗어나서 전화 하나에 복귀을 깨는 값 없이 사용될 수 있다.

파스칼에는 돌아오지 않는 진술이다.( 하지만, 새로운 파스칼의에서.Exit(exp);즉시 값을 반환하도록 사용할 수 있습니다.파라미터를 지정하지 않으면 절차가 중단됩니다.)서브루틴은 실행이 마지막 실행 파일 문에 도달하면 자동으로 반환됩니다.값은 파스칼 용어의 함수인 서브루틴과 동일한 이름을 가진 식별자에 할당하여 반환할 수 있습니다.이와 같이 함수 ID는 재귀 콜 및 결과 홀더로 사용됩니다.이것은 구문적으로 명시적인 출력 파라미터와 비슷합니다.Fortran 66 및 Fortran 77에서도 동일한 구문이 사용되지만 반환문은 Fortran II에 추가되었습니다.일부 다른 언어에서는 함수 식별자 대신 사용자 정의 결과 변수가 사용됩니다.

오베론(Oberon-07)에는 반환문 대신 반환 조항이 있습니다.return 절은 절차 본문의 마지막 문 뒤에 배치됩니다.이것에 의해, 프로시저로부터의 적절한 반환치 및 반환치의 컴파일 타임 체크가 가능하게 됩니다.

Lisp, Perl Ruby와 같은 일부 표현식 지향 프로그래밍 언어는 프로그래머가 명시적인 반환문을 생략할 수 있도록 하며 대신 마지막으로 평가된 표현이 서브루틴의 반환값임을 지정합니다.

다른 경우 명시적인 return 문이 없는 경우 Null 값이 반환됩니다. Python에서는 이 반환됩니다.Nonereturn 문이 생략되면 반환되지만 JavaScript에서는 값이 반환됩니다.undefined이 반환됩니다.

Windows PowerShell에서는 캡처되지 않은 모든 평가된 표현식(예: 변수에 할당되거나 void로 캐스트되거나 $null로 파이핑됨)이 서브루틴에서 배열의 요소로 반환되거나 하나의 개체만 캡처되지 않은 경우에는 단일 개체로 반환됩니다.

Perl에서는 서브루틴의 반환값 또는 값은 호출된 컨텍스트에 따라 달라질 수 있습니다.가장 기본적인 구별은 발신 코드가1개의 값을 상정하는 스칼라 컨텍스트, 발신 코드가 값의 리스트를 상정하는 리스트콘텍스트, 발신 코드가 리턴 값을 전혀 상정하지 않는 보이드콘텍스트입니다서브루틴은 다음 명령어를 사용하여 콘텍스트를 체크할 수 있습니다.wantarray기능.scalar 컨텍스트에서 정의되지 않은 값을 반환하고 목록 컨텍스트에서 빈 목록을 반환하려면 인수 없는 반환 구문을 사용합니다.스칼라 컨텍스트는 부울, 숫자, 문자열다양한 참조 유형 컨텍스트로 더 나눌 수 있습니다.또, 콘텍스트에 의존한 오브젝트는, 스칼라치를 천천히 평가해, 콘텍스트에 의존한 리턴 시퀀스를 사용해 반환할 수 있습니다.

많은 운영체제는 프로세스가 종료될 때 프로그램이 (일반 출력과는 별도로) 결과를 반환하도록 합니다.이러한 값을 반환 코드라고 부릅니다.구체적으로는 종료 상태라고 부릅니다.이러한 방법으로 전달될 수 있는 정보의 양은 상당히 제한적이며, 실제로는 성공 또는 실패를 알리는 신호로 제한되는 경우가 많습니다.이 반환은 일반적으로 프로그램 내에서 종료(시스템 호출)를 호출함으로써 이루어집니다(주기능에서 복귀하는 대체 메커니즘을 사용할 수 있는 C에서도 공통).

구문

반환문은 다양한 형태로 제공됩니다.가장 일반적인 구문은 다음과 같습니다.

언어 반품 명세서 값을 생략한 경우 반환
Ada, Bourne 쉘,[1] C, C++, Java, PHP, C#, JavaScript, D
돌아가다 가치; 
본 셸에서 함수로 실행된 마지막 명령어 종료 값

C 및 C++[3]에서[2] 함수가 값을 반환하는 경우 정의되지 않은 동작

PHP에서 [4]반환NULL

Javascript에서 [5]값을 반환합니다.

Java 및 C#에서는 함수가 값을 반환하는 경우 허용되지 않습니다.

기본의
돌아가다 
리스프
(돌아가다 가치) 
마지막 스테이트먼트 값
Perl, 루비
돌아가다 @값; 돌아가다 $value($value); 돌아가다; 

또는 컨텍스트 리턴 시퀀스

마지막 스테이트먼트 값
PL/I
반환(의사); 반환;

프로시저가 값을 반환하는 것으로 선언된 경우 정의되지 않은 동작
파이썬
돌아가다 가치 
None
스몰토크
^ 가치 
TCL
반환 $value return - 코드 오류 "오류 메시지"

또는 보다 복잡한 옵션 조합으로

마지막 스테이트먼트 값
Visual Basic.그물
돌아가다 가치 
Windows PowerShell
돌아가다 가치; 
물건
x86 어셈블리
리트 
eax 레지스터의 내용(규칙에 따라)

를 들어 MOS 테크놀로지 6502의 경우 일부 어셈블리 언어에서는 니모닉 "RTS"(ReTurn from Subroutine)가 사용됩니다.

다중 return

return 문이 명시적으로 있는 언어는 동일한 함수에 여러 개의 return 문이 있을 수 있습니다.그것이 좋은 것인지 아닌지는 논란의 여지가 있다.

구조화된 프로그래밍을 강력하게 지지하기 때문에 각 함수에 단일 엔트리 및 단일 출구(SESE)가 있습니다.따라서 서브루틴의 텍스트 끝을 제외하고 명시적 리턴 스테이트먼트의 사용을 피해야 한다는 주장이[6] 제기되어 왔다.이는 서브루틴이 "조기 리턴"에 사용되었을 때 GOTO 스테이트먼트에 발생하는 것과 같은 종류의 문제에 시달릴 수 있기 때문이다.반대로, 더 깊은 중첩과 같이 더 복잡한 코드가 가독성을 해치는 경우 리턴 문을 사용하는 것이 가치가 있다고 주장할 수 있다.

David Watt는 2004년 교과서에서 "싱글 엔트리 멀티 출구 제어 흐름이 종종 바람직하다"고 쓰고 있습니다.시퀀서에 대한 테네트의 프레임워크 개념을 사용하여 와트는 현대 프로그래밍 언어에서 발견되는 제어 흐름 구조를 균일하게 설명하고 다중 출구 제어 흐름의 맥락에서 특정 유형의 시퀀서가 다른 것보다 더 나은 이유를 설명하려고 시도합니다.Watt는 독자가 점프의 대상이 되는 실제 라벨이나 주소를 찾아 조사할 때까지 점프의 대상이 프로그램 독자에게 직접 설명되지 않기 때문에 제한되지 않은 gotos(점프 시퀀스)는 나쁘다고 쓰고 있습니다.이와는 대조적으로, Watt는 리턴 시퀀서의 개념적 의도는 대상을 조사할 필요 없이 자체 컨텍스트에서 명확하다고 주장합니다.또한, Watt는 이스케이프 시퀀서로 알려진 시퀀서의 클래스는 "텍스트로 둘러싸인 명령 또는 프로시저의 실행을 종료하는 시퀀스"로 정의되며 루프로부터의 브레이크(멀티 레벨 브레이크 포함)와 리턴 스테이트먼트를 모두 포함합니다.Watt는 또한 점프 시퀀서(gotos)가 C와 같은 언어에서 다소 제한되고 있지만, 여기서 타겟은 내부 로컬 블록 또는 포괄적인 외부 블록이어야 하지만, 그 제한만으로는 C의 자기 기술에서 gotos의 의도를 만들기에 충분하지 않고 여전히 "스파게티 코드"를 생성할 수 있다고 지적합니다.또한 Watt는 예외 시퀀서가 이스케이프 및 점프 시퀀서와 어떻게 다른지 조사합니다. 이에 대한 자세한 내용은 구조화된 프로그래밍 [7]관련 기사를 참조하십시오.

에릭 S가 인용한 경험적 연구에 따르면 Roberts, 학생 프로그래머는 여러 개의 출구를 허용하지 않는 Pascal과 같은 언어로 된 몇 가지 간단한 문제에 대한 올바른 해결책을 만드는 데 어려움을 겪었습니다.배열에서 요소를 선형적으로 탐색하는 함수를 쓰는 문제에 대해, 헨리 샤피로(Roberts에 의해 인용)의 1980년 연구는 파스칼이 제공한 제어 구조만을 사용하여, 정확한 해답이 피험자의 20%에 의해서 주어지는 반면, 어떤 피험자도 m에서 반환을 쓸 수 있다면 이 문제에 대해 잘못된 코드를 쓰지 않았다는 것을 발견했다.루프의 [8]아이돌

Kent Beck와 Martin Fowler를 포함한 다른 사람들은 하나 이상의 가드 절, 즉 함수의 시작 부근에 있는 조건부 "조기 종료" 반환 문장이 종종 함수를 [9][10][11][12]대안보다 읽기 쉽게 만든다고 주장한다.

조기 종료 시 가장 일반적인 문제는 할당된 메모리가 할당되지 않거나 열려 있는 파일이 닫히지 않아 누수가 발생하는 등 청소나 최종 스테이트먼트가 실행되지 않는 것입니다.이러한 작업은 각 반품 사이트에서 수행해야 합니다.이는 취약하고 버그가 발생하기 쉽습니다.예를 들어, 나중에 개발하면 개발자에 의해 리턴 스테이트먼트가 간과될 수 있으며 서브루틴의 마지막에 실행되어야 하는 액션(예를 들어 트레이스 스테이트먼트)이 모든 경우에 수행되지는 않을 수 있습니다.표준 Pascal과 같이 반환문이 없는 언어에는 이러한 문제가 없습니다.C++ 및 Python과 같은 일부 언어에서는 반환 시(또는 예외 투척) 자동으로 액션을 수행할 수 있는 개념을 채택하여 이러한 문제를 완화합니다. 이러한 개념을 종종 "try/finally" 또는 유사한 것으로 알려져 있습니다.이러한 "finally" 구와 같은 기능은 서브루틴의 단일 리턴 포인트에 대한 goto에 의해 구현될 수 있습니다.대체 솔루션은 함수 종료 시 일반 스택 언바인딩(변수 할당 해제)을 사용하여 로컬 변수의 소멸자를 통해 리소스 할당을 해제하거나 Python의 "with" 문과 같은 유사한 메커니즘을 사용하는 것입니다.

원래의 파스칼이나 C와 같은 언어의 초기 구현에서는 컴파일러를 단순화하기 위해 함수에 의해 반환될 수 있는 타입(레코드나 구조 타입을 지원하지 않음)이 제한되었습니다.

자바(JavaScript) 자바스크립트와 같은 유사한 언어에서는 try-catch 구조의 마지막 블록항상 실행되기 때문에 return 스테이트먼트 이후에도 코드를 실행할 수 있습니다.따라서 return 스테이트먼트가 try 또는 catch block 에 배치되어 있는 경우, 최종적으로 (추가되어 있는 경우) 내의 코드가 실행됩니다.종료가 나중에 발생하기 때문에 [13]비 프리미티브 유형(이미 반환된 객체의 속성)의 반환 값을 변경할 수도 있습니다.

수익률 발언

return 스테이트먼트에는 return 스테이트먼트가 있습니다.return 스테이트먼트에 의해 서브루틴이 종료되는 경우, return 스테이트먼트에 의해 Coroutine 일시정지됩니다.코루틴은 나중에 다시 호출되면 정지된 위치에서 계속됩니다.코루틴은 서브루틴보다 구현에 훨씬 더 많이 관여하기 때문에 반환문보다 yield 문이 덜 일반적이지만 여러 언어로 볼 수 있습니다.

Call/return 시퀀스

하드웨어 명령어세트에 따라 다음과 같은 콜/리턴 시퀀스가 다수 가능합니다.

  1. CALLinstruction은 스택의 다음 명령 주소를 푸시하고 지정된 주소로 분기합니다.RETURNinstruction은 스택에서 명령 포인터로 반환 주소를 팝업하고 해당 주소에서 실행을 재개합니다(예: x86, PDP-11).
  2. CALLinstruction은 레지스터에 다음 명령의 주소를 배치하고 지정된 주소로 분기합니다.RETURN명령 시퀀스는 레지스터의 반환 주소를 명령 포인터에 배치하고 해당 주소에서 실행을 재개합니다(IBM System/360, 대부분의 RISC 아키텍처).
  3. CALLinstruction은 다음(또는 현재) 명령의 주소를 콜 주소의 스토리지 위치에 배치하고 지정된 주소+1로 분기합니다.RETURN명령 시퀀스는 서브루틴의 첫 번째 명령으로 간접 점프함으로써 반환 주소로 분기합니다.(예: IBM 1130, SDS9XX, PDP-8)

「 」를 참조해 주세요.

레퍼런스

  1. ^ Bourne 쉘에서는 0 ~255 범위의 정수만 반환할 수 있습니다.https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#return
  2. ^ https://msdn.microsoft.com/en-us/library/sta56yeb.aspx MSDN: 반환문 (C)
  3. ^ https://msdn.microsoft.com/en-us/library/k68ktdwf.aspx MSDN: 반환문 (C++)
  4. ^ "PHP: return - Manual". PHP Manual. The PHP Group. Retrieved 26 March 2013.
  5. ^ "Return - Javascript". MDN Javascript Reference. Mozilla Developer Network. Retrieved 27 March 2013.
  6. ^ C++ 주의:함수 반환문
  7. ^ David Anthony Watt; William Findlay (2004). Programming language design concepts. John Wiley & Sons. pp. 215–221. ISBN 978-0-470-85320-7.
  8. ^ Roberts, E. [1995] "루프 종료 및 구조화된 프로그래밍: 토론 재개", ACM SIGCSE Bulletin, (27) 1: 268–272.
  9. ^ 마틴 파울러, 켄트 벡, 존 브랜트, 윌리엄 옵다이크, 돈 로버츠"리팩터링: 기존 코드 설계 개선(Google eBook). 섹션 "내스트된 조건을 가드 조항으로 대체". 2012. 페이지 237, 페이지 250. 인용문: "... 하나의 출구점 사고방식...한 방식에서 하나의 출구 지점에 대한 규칙을 따르지 않습니다."
  10. ^ 켄트 벡.「실장 패턴」.2007. "7장: 행동", 섹션 "보호 조항"
  11. ^ "복수반납명세서"
  12. ^ 프레드 스와츠."반환명세서단일 출구 판타지"
  13. ^ 마지막으로 블록,Java 튜토리얼