조건부(컴퓨터 프로그래밍)

Conditional (computer programming)
If-Then-Else 흐름도
중첩된 'If-Then-Else' 흐름도

컴퓨터 과학에서 조건문(즉, 조건문, 조건식조건 구문)은 결정을 처리하기 위한 프로그래밍 언어 명령어입니다.구체적으로는 프로그래머 정의 부울 조건이 true인지 false인지에 따라 조건부는 다른 계산 또는 액션을 수행합니다.제어흐름의 관점에서 판단은 항상 (분기예측과는 별도로) 어떤 조건에 따라 선택적으로 제어흐름을 변경함으로써 이루어진다.

동적 디스패치는 보통 조건부 구성으로 분류되지 않지만 실행다른 옵션을 선택하는 또 다른 방법입니다.

용어.

명령형 프로그래밍 언어에서는 보통 "조건문"이라는 용어가 사용되는 반면, 함수형 프로그래밍에서는 "조건식" 또는 "조건 구성"이라는 용어가 선호되는데, 이러한 용어들은 모두 다른 의미를 가지고 있기 때문이다.

If-then(-else)

if–thenconstruct(일명 construct)if–then–else)는 많은 프로그래밍 언어에서 공통적으로 사용됩니다.구문은 언어에 따라 다르지만 기본 구조(의사 코드 형식)는 다음과 같습니다.

If(부울 상태) 후 (결과적) 그 외 (대체적)의 경우 종료(End If)]

예를 들어 다음과 같습니다.

stock=0이면 message=새로운 stock을 주문합니다.그렇지 않으면 message=stock이 있습니다.

위의 예에서 (부울란 조건)으로 표현되는 부분은 내재가치(예를 들어 어느 하나의 값으로 치환해도 좋다)를 갖는 조건식을 구성한다.True또는False하지만 본질적인 의미는 없습니다.이와는 대조적으로, 이 표현의 조합은If그리고.Then그것을 둘러싼, 그리고 그 후의 결과는, 본질적인 의미(예를 들면, 논리적인 룰의 표현)를 가지지만, 본질적인 가치는 없는 조건부 진술을 구성한다.

인터프리터가 검출했을 때If부울 조건을 상정하고 있습니다.예를 들어 다음과 같습니다.x > 0는 변수 x에 0보다 큰 숫자가 포함되어 있음을 의미하며 이 조건을 평가합니다.조건이 다음과 같으면true, 다음 명령어then실행됩니다.그렇지 않으면 다음 브런치 중 하나에서 실행이 계속됩니다.else 블록(통상 옵션) 또는 블록이 없는 경우else브런치, 그 후end If.

어느 하나의 분기가 실행된 후 컨트롤은 다음 포인트로 돌아갑니다.end If.

역사와 발전

초기 프로그래밍 언어, 특히 1980년대 가정용 컴퓨터의 BASIC의 일부 방언에서,if–then스테이트먼트에 포함할 수 있는 것은GOTO스테이트먼트(브런치명령어에 준거).이것은 스파게티 프로그래밍으로 알려진 읽기 어려운 스타일의 프로그래밍으로 이어졌고, 스파게티 코드라고 불리는 이 스타일의 프로그램들이 있었다.그 결과, 구조화된 프로그래밍을 통해 (실질적으로) 임의의 스테이트먼트를 스테이트먼트 블록에 넣을 수 있습니다.if대부분의 BASIC 프로그래밍 서클에서도 표준이 될 때까지 인기를 끌었다.이러한 메커니즘과 원리는 오래되었지만 더 발전된 ALGOL 계열의 언어에 기초하고 있으며, 파스칼과 Modula-2같은 ALGOL 계열의 언어는 오랫동안 현대의 BASIC 변형에 영향을 미쳤다.사용 중에만 가능하지만GOTO에 기재되어 있는 스테이트먼트if–then스파게티 코드가 아니고 구조화된 프로그래밍 언어로 작성된 프로그램만큼 잘 구조화되고 읽을 수 있는 프로그램을 작성하기 위한 스테이트먼트, 구조화된 프로그래밍은 이것을 더 쉽게 만들고 강제합니다.구조화if–then–else위의 예시와 같은 문장은 구조화된 프로그래밍의 주요 요소 중 하나이며, C, Java, JavaScript, Visual Basic과 같은 가장 인기 있는 고급 프로그래밍 언어로 나타납니다.

"다른 문제"

else키워드는 특정 대상을 지정하기 위해 작성됩니다.if–then앞에 있는 스테이트먼트, 단, 네스트된 스테이트먼트 if–thenALGOL 60과 같은 고전 프로그래밍 언어들은 어떤 특정 문장을 대상으로 할지 정의하는데 어려움을 겪었습니다.어떤 진술이 어떤 것인지 명확한 경계가 없다면else키워드는 앞의 임의의 대상을 지정할 수 있습니다.if–then해석된 대로 네스트에 있는 스테이트먼트.

a경우 b의 경우 s2의 경우

라고 해석할 수 있다

a의 경우(b의 경우 s)의 경우 s2의 경우

또는

a의 경우(b의 경우 s2)

의 유무에 따라else첫 번째와 관련되어 있습니다.if두 번째 또는 두 번째if이것은 행잉 그 외의 문제로 알려져 있으며 언어에 따라 다양한 방법으로 해결됩니다(일반적으로 를 통해).end if스테이트먼트 또는{...}괄호)를 참조해 주세요.

그렇지 않으면

사용방법else if, 여러 조건을 조합할 수 있습니다.true로 판명된 첫 번째 조건 이후의 스테이트먼트만 실행됩니다.다른 문은 모두 건너뜁니다.

if condition then -- statement else if condition then -- statements else then --  많은 스테이트먼트, ...other -- other 스테이트먼트. 만약 그렇다면 종료한다.

예를 들어, 한 품목에 대해 최대 30% 할인을 제공하는 상점의 경우:

할인율이 11% 미만인 경우 인쇄(30달러 지불)하고, 할인율이 21% 미만인 경우 인쇄(20달러 지불)하고, 할인율이 31% 미만인 경우 인쇄(10달러 지불)가 종료됩니다.

위의 예에서 할인이 10%인 경우 첫 번째 if 문구가 참으로 평가되고 "30달러를 지불하셔야 합니다"가 출력됩니다.if 문이 건너뛸 경우 먼저 아래의 다른 모든 문장은 건너뜁니다.

elseif예를 들어, 에이다 언어에서 진술은 단순히 통사적인 설탕이다.else이어서if에이다의 차이점은 오직 한 명뿐이라는 것이다.end if필요한 경우elseif대신else이어서ifPHP는elseif괄호 또는 콜론 구문의 경우 키워드를 지정합니다[1].Perl은 다음 키워드를 제공합니다.elsif여러 개의 교정기가 필요할 수 있는 많은 교정기를 피하기 위해if그리고.else진술들.Python은 특별한 키워드를 사용합니다.elif구조가 괄호보다는 움푹 패임으로 나타나기 때문에, 반복적인 사용else그리고.if모든 조건 후에 더 많은 움푹 패인 곳이 필요할 거예요Visual [2]Basic과 같은 BASIC의 일부 구현에서는ElseIf마찬가지로 이전 UNIX 쉘(나중에 POSIX 쉘 구문까지[3] 수집)에서도 elif를 사용하지만 공백, 줄 바꿈 또는 둘 다로 구분하는 선택지가 있습니다.

그러나, Simula, Pascal, BCPLC와 같은 많은 언어에서 보다 직접적으로 Algol에서 유래한 이 특별한 구문에서는,else ifconstruct는 존재하지 않으며 Java, ECMAScript C의 많은 구문 파생어에도 존재하지 않습니다.이러한 언어에서는 단일 스테이트먼트(이 경우)가 기능합니다.if cond...)는 블록에 둘러싸이지 않고 조건 조건을 따를 수 있습니다.

이 설계에는 약간의 "비용"이 듭니다.각각else ifbranch는 효과적으로 네스트레벨을 추가합니다.이것은 컴파일러(또는 컴파일러를 쓰는 사람)의 작업을 복잡하게 합니다.왜냐하면 컴파일러는 임의로 긴 시간 동안 분석 및 구현해야 하기 때문입니다.else if재귀적으로 쇠사슬을 묶다

조건 수열의 모든 항이 단일 식 값을 검정하는 경우(예:if x=0...else if x=1...else if x=2또는 스위치 스테이트먼트(case-statement 또는 select-statement라고도 함)를 사용할 수 있습니다.반대로 switch 문이 없는 언어에서는 이러한 명령어는 다음과 같은 순서로 작성될 수 있습니다.else if진술들.

If-then-else 표현

많은 언어가 if 문과 유사한 if 식을 지원하지만 if 문은 if 문과 유사합니다.따라서 이러한 표현은 문장이 아닌 진정한 표현식(값으로 평가)입니다(값의 컨텍스트에서는 허용되지 않을 수 있습니다).

알골족

ALGOL 60ALGOL 패밀리의 일부 다른 구성원은 다음을 허용합니다.if–then–else표현으로서:

myvariable : = x > 20이면 1 other 2

리스프어

리스프 방언(Scheme, Racket, Common Lisp) - 첫 번째는 ALGOL에서 많은 영감을 얻은 것입니다.

;;; 스킴 (정의하다근변수 (한다면(>x 12) 1 2))   ; 'x' 값에 따라 'myvariable'을 1 또는 2에 할당합니다. 
;; 공통 리스프 (허락하다 ((x 10))   (설정 근변수 (한다면 (> x 12) 2 4)))  ; 'myvariable'을 2에 할당합니다. 

하스켈

Haskell 98에는 if 표현, no if 문 및else모든 표현식에는 어느 정도의 [4]값이 있어야 하므로 파트는 필수입니다.다른 언어에서 조건부로 표현되는 논리는 보통 재귀함수에서 패턴 매칭으로 표현됩니다.

Haskell은 게으르기 때문에 예를 들어 if와 같은 제어 구조를 일반 표현식으로 작성할 수 있습니다. 느림 평가란 if 함수가 조건과 적절한 분기만 평가할 수 있음을 의미합니다(이 경우 엄격한 언어는 이 세 가지 모두를 평가할 수 있습니다).다음과 [5]같이 쓸 수 있습니다.

만약의 경우' ::  -> a -> a -> a 만약의 경우' 진실의 x _ = x 만약의 경우' 거짓의 _ y = y 

C어족 언어

C 및 C와 같은 언어에는 다음과 같은 템플릿에 의해 설명될 수 있는 함수를 가진 조건부 식에 대해 특별한 3진 연산자(?:)가 있습니다.

condition ? evaluated-when-true : evaluated-when-false 

즉, if 스테이트먼트와는 달리 C와 같은 언어로 표현식에 삽입할 수 있습니다.

my_my_my_my_my_my_my = x > 10 ? "푸" : '바';  // C형 언어 

이것은 Algol 패밀리 if-then-else 과 비교될 수 있습니다(문장과 대조적으로). (그리고 루비와 스칼라 등에서도 유사합니다.)

if-statement를 사용하여 동일한 작업을 수행하려면 (일반 레이아웃 규칙에 따라) 여러 줄의 코드가 필요하며 "my_variable"을 두 번 언급해야 합니다.

한다면 (x > 10)     my_my_my_my_my_my_my = "푸"; 또 다른     my_my_my_my_my_my_my = '바'; 

어떤 사람들은 명시적인 if/then 문장이 읽기 쉽고 그것이 3진 [6]연산자보다 더 효율적인 코드로 컴파일될 수 있다고 주장하는 반면, 다른 사람들은 간결한 문장이 반복을 포함하는 여러 줄에 걸쳐 있는 문장보다 읽기 쉽다고 주장한다.

스몰 베이직

x = 텍스트 창.번호 읽기() 한다면 (x > 10) 그리고나서     텍스트 창.기입선("변수의 이름은 'foo'입니다.") 또 다른     텍스트 창.기입선("변수 이름은 'bar'입니다.") 엔드 If 

먼저 사용자가 프로그램을 실행하면 판독기가 숫자를 입력하기를 기다리는 커서가 나타납니다.이 숫자가 10보다 크면 "My variable is named 'foo"라는 텍스트가 화면에 표시됩니다.숫자가 10보다 작으면 "My variable is named 'bar'"라는 메시지가 화면에 표시됩니다.

비주얼 베이직

Visual Basic 및 기타 언어에서 Visual Basic이라는 기능IIf는 조건식으로 사용할 수 있습니다.그러나 참과 거짓 브랜치는 항상 평가되기 때문에 진정한 조건식과 같이 동작하지 않습니다.그것은 단지, 한쪽 브랜치의 결과는 폐기되고 다른 한쪽의 결과는 IIf 함수에 의해서 반환되는 것입니다.

TCL

Tcl if는 키워드가 아니라 함수입니다(TCL에서는 명령어 또는 명령어로 알려져 있습니다.proc예를 들어,

한다면 {x달러 > 10} {    놓다 "푸!" } 

라는 이름의 함수를 호출합니다.if2개의 인수를 전달합니다.첫 번째는 조건이고 두 번째는 진정한 분기입니다.두 인수 모두 문자열로 전달됩니다(Tcl에서는 중괄호 안의 모든 인수는 문자열입니다).

위의 예에서는 함수를 호출하기 전에 조건이 평가되지 않습니다.대신에, 의 실장if함수는 조건을 문자열 값으로 수신하고 이 문자열을 발신자 [7]스코프에서의 식으로서 평가합니다.

이러한 동작은 다음을 사용하여 가능합니다.uplevel그리고.expr명령어:

Uplevel로 도구 명령 언어 절차(예를 들어, uplevel 그 동안을 구현하기 위해 구성한 도구 명령 언어 절차로 사용할 수 있도록)이 가능한 새로운 컨트롤 구문을 구현할 수 있다.[8]

왜냐면if또한 값을 반환합니다 있나 실제로 함수:.

는 실행된 몸 스크립트의 명령에서 반환 값 결과, 또는 빈 문자열을 표현 중 어느 누구가 없bodyN다 0이 아닌 있었다.[9]

러스트에서,if있나 항상 표정이다.그것은 중의 지점이 실행되 값 단위 형식에 측정한다.()없으면 가지가 실행된다.만약 가지 하나를 반환 값을 제공하지 않는다, 그것에 측정한다.()기본적으로.는 보장하기 위해서if표현의 형식은 컴파일 시간에 알려져 있으며, 각 지점은 같은 형식의 값으로 소개해야 한다.이런 이유로,else지 않는 한 다른 나뭇가지로 평가 분기 효과적으로 강제됩니다.(), 때문if한 없이else항상 평가할 수 있()디폴트입니다.[10]

// x 값에 따라 my_variable 값을 할당합니다. 허락하다 my_my_my_my_my_my_my = 한다면 x > 20 {     1 } 또 다른 {     2 };  // 1과 ()의 유형이 다르기 때문에 이 변형은 컴파일되지 않습니다. 허락하다 my_my_my_my_my_my_my = 한다면 x > 20 {     1 };  // 필요 없는 경우 값을 생략할 수 있습니다. 한다면 x > 20 {     프린트!("x가 20보다 큽니다."); } 

산술적 if

Fortran 77까지, 언어 Fortran은 삼분할 x < 0, x = 0, x > 0에 근거하여 계산된 IF와 케이스 스테이트먼트 중간인 "산술 if" 스테이트먼트를 가지고 있다.이것은 Fortran에서 [11]가장 이른 조건문입니다.

한다면 (e) 라벨 1, 라벨 2, 라벨3 

여기서 e는 임의의 숫자 표현식(꼭 정수일 필요는 없습니다)입니다.이것은 다음과 같습니다.

한다면 (e .LT. 0) 에 가다라벨 1 한다면 (e .EQ. 0) 에 가다라벨 2 에 가다라벨3 

왜냐하면 이 산술적 IF는 배수와 같기 때문이다.GOTO다른 곳으로 점프할 수 있는 스테이트먼트는 비구조화 제어 스테이트먼트로 간주되며 보다 구조화된 스테이트먼트를 사용할 수 있는 경우에는 사용하지 마십시오.실제로 대부분의 산술은 관찰되어 왔다IF문장은 다음 문장과 1개 또는 2개의 라벨을 참조하고 있습니다.

이것은 IBM 704 컴퓨터에서 Fortran의 원래 구현에서 유일한 조건부 제어 문장이었습니다.그 컴퓨터에서는 테스트앤브런치 운영코드가 이들 3개 주에 대해 3개의 주소를 가지고 있었다.다른 컴퓨터들은 마지막 산술 연산과 관련된 양의, 0의, 음의, 짝수의, 오버플로우, 캐리어와 같은 "플래그" 레지스터를 가지고 있을 것이며 '축적기 음의 경우 분기', '축적기 0의 경우 분기'와 같은 명령을 사용할 것입니다.표현식은 번만 평가되며 오버플로가 발생할 수 있는 정수 산술 등의 경우에는 오버플로 또는 반송 플래그도 고려됩니다.

Smalltalk에서의 객체 지향 구현

다른 언어와는 대조적으로 Smalltalk에서 조건부 문장은 언어 구조가 아니라 클래스에서 정의됩니다.Boolean두 개의 매개변수를 모두 사용하는 추상적 방법으로서, 개의 폐쇄. Boolean2개의 서브클래스가 있습니다.True그리고.False둘 다 메서드를 정의합니다.True첫 번째 폐쇄만 실행합니다.False두 번째 폐쇄만 [12]실행합니다.

var = 조건 ifTrue: [foo] ifFalse: ['bar']

자바스크립트

JavaScript는 C 언어 또는 이와 유사한 if-else 문을 사용합니다.부울 값은 reserved if 키워드와 왼쪽 콜 괄호 사이의 괄호 내에서 받아들여집니다.

한다면 (수학.랜덤() < > 0.5) {   콘솔.로그.("머리야!"); } 또 다른 {   콘솔.로그.("꼬리가 있어!"); } 

위의 예에서는 다음 조건을 채택하고 있습니다.Math.random() < 0.5출력되는 것true0과 1 사이의 랜덤 플로트 값이 0.5보다 큰 경우.이 문장은 출력 중 하나를 랜덤으로 선택하기 위해 사용합니다.You got Heads!또는You got Tails!콘솔로 이동합니다.else 및 else-if 스테이트먼트는 다음에 나타나듯이 그 앞에 있는 스테이트먼트의 콜리 괄호 뒤에 필요한 횟수만큼 체인할 수도 있습니다.

변화하다 x = 수학.랜덤(); 한다면 (x < > 1/3) {   콘솔.로그.("한 사람이 이겼어!"); } 또 다른 한다면 (x < > 2/3) {   콘솔.로그.("두 사람이 이겼어!"); } 또 다른 {   콘솔.로그.("3자 동점입니다!"); } 

람다 미적분

람다 미적분학에서 if-then-else 조건의 개념은 다음 식을 사용하여 표현할 수 있다.

true = xx. λy.x false = xx. y ifThenElse = (c. xx. yy. (c x y))
  1. true는 최대 두 개의 인수를 사용하며, 둘 다 지정되면(커링 참조), 주어진 첫 번째 인수를 반환합니다.
  2. false는 최대 두 개의 인수를 사용하며, 둘 다 지정되면(커링 참조), 주어진 두 번째 인수를 반환합니다.
  3. ThenElse가 최대 3개의 인수를 사용하고 모든 인수를 지정하면 두 번째 인수와 세 번째 인수를 모두 첫 번째 인수(두 개의 인수를 부여하고 결과를 생성하는 함수)로 전달합니다.ThenElse가 true 또는 false를 인수로만 받아들이면 둘 다 주어진 두 개의 인수를 선호하는 단일 인수에 투영하고, 그 인수는 반환됩니다.

주의: ThenElse가 왼쪽과 오른쪽의 조건으로서2개의 함수를 건네받았을 경우, 선택한 함수를 실제로 호출하기 위해서는 빈 태플()을 ifThenElse의 결과에도 건네주어야 합니다.그렇지 않을 경우 ThenElse는 호출되지 않고 함수 오브젝트를 반환합니다.

정의 없이 숫자를 사용할 수 있는 시스템(Lisp, 종래의 종이 수학 등)에서는, 상기의 1개의 닫힘으로서 다음과 같이 나타낼 수 있습니다.

 ((③맞아. ②거짓말. ③만약 Else.      (If Then Else 진실의 2 3)  )(x개 y. x)(x개 y. y)(c. ①l. r. c l r)) 

여기서 true, false 및 ifThenElse는 각각의 정의에 결합되어 블록의 끝에 있는 스코프로 전달됩니다.

이에 대한 유효한 JavaScript 유추(단일 변수의 함수만 사용)는 다음과 같습니다.

 변화하다 계산 결과 = ((_진짜 => _false(거짓) => _If Then Else =>       _If Then Else(_진짜)(2)(3)   )(x => y => x)(x => y => y)(c => x => y => c(x)(y))); 

위의 다변수 함수 코드는 다음과 같습니다.

 변화하다 계산 결과 = ((_진짜, _false(거짓), _If Then Else) =>      _If Then Else(_진짜, 2, 3)  )((x, y) => x, (x, y) => y, (c, x, y) => c(x, y)); 

번호가 가정된 시스템이 없는 이전 예의 다른 버전은 다음과 같습니다.

첫 번째 예시는 첫 번째 분기를 나타내고 두 번째 예시는 두 번째 분기를 나타내고 있습니다.

 ((③맞아. ②거짓말. ③만약 Else.      (If Then Else 진실의 (①제1지점 퍼스트 브랜치) (§ 세컨드 브랜치 세컨드 브랜치))  )(x개 y. x)(x개 y. y)(c. ①l. r. c l r))   ((③맞아. ②거짓말. ③만약 Else.      (If Then Else 거짓의 (①제1지점 퍼스트 브랜치) (§ 세컨드 브랜치 세컨드 브랜치))  )(x개 y. x)(x개 y. y)(c. ①l. r. c l r)) 

Smalltalk는 True와 False 표현에 대해 유사한 아이디어를 사용합니다.True와 False는 메시지에 대해 다른 ifTrue/ifFalse로 응답하는 싱글톤 객체입니다.

Haskell은 부울 타입에 대해 이 정확한 모델을 사용했지만, 대부분의 Haskell 프로그램에서는 구문설탕 "if a then b else c" 구성을 사용합니다.이것은 ifThenElse가 다른 함수로 래핑되거나 이 페이지의 Haskell 섹션에 나타나듯이 재실장되지 않는 한 구성되지 않습니다.

케이스 및 스위치 스테이트먼트

스위치 문(일부 언어, 대소문자 문 또는 멀티웨이 브랜치)은 지정된 상수와 값을 비교하여 일치하는 첫 번째 상수에 따라 액션을 수행합니다.일반적으로 일치하는 항목이 없을 경우 기본 액션('else', '그렇지 않으면')을 실행하는 조항이 있습니다.switch 문을 사용하면 룩업테이블 등컴파일러 최적화가 가능합니다.동적 언어에서는 대소문자가 상수 표현으로 제한되지 않고 오른쪽 셸 스크립트의 예시와 같이 패턴 매칭으로 확장될 수 있습니다.여기서 "*"는 임의의 문자열에 일치하는 정규 표현으로 기본 대소문자를 구현합니다.

파스칼: C: 스크립트:
사례. 일부 Char    'a': 액션 온a;   'x': 액션 OnX;   'y','z':액션 On YandZ;   또 다른 액션 On No Match; 끝.; 
전환하다 (일부 Char) {   사례. 'a': 액션 온a; 브레이크.;   사례. 'x': 액션 OnX; 브레이크.;   사례. 'y':   사례. 'z': 액션 On YandZ; 브레이크.;   체납: 액션 On No Match; } 
케이스 $someChar in a) 액션OnA;;; x) 액션OnX;;;; [yz]) 액션OnYandZ;;;;*) 액션OnNoMatch; esac

패턴 매칭

패턴 매칭은 if-then-else 문장과 case 문장의 대안으로 볼 수 있습니다.Wolfram Language, ML 및 기타 많은 프로그래밍 언어로 사용할 수 있습니다.OCaml 언어로 작성된 간단한 예를 다음에 나타냅니다.

경기 과일 와 함께   "애플" -> 요리하세요 파이   "실패" -> 요리하세요 당고모치   "실패" -> 섞다;; 

패턴 매칭의 힘은 동작뿐만 아니라 을 데이터 패턴에 간결하게 매칭하는 능력입니다.다음 예시는 Haskell로 기술되어 있으며, 이 두 가지 기능을 모두 나타내고 있습니다.

지도 _ []      = [] 지도 f (h : t) = f h : 지도 f t 

코드는 첫 번째 인수(a 함수)를 두 번째 인수(목록)의 각 요소에 적용하고 결과 목록을 반환하는 함수 맵을 정의합니다.2행은 이 경우 가능한2종류의 인수에 대한 함수의 2가지 정의입니다.하나는 리스트가 비어 있는 경우(빈 리스트만 반환)와 다른 하나는 리스트가 비어 있지 않은 경우입니다.

패턴 매칭은 엄밀히 말하면 항상 선택 구성이라고 할 수 없습니다.왜냐하면 Haskell에서는 항상 일치할 수 있는 하나의 대안만을 쓸 수 있기 때문입니다.이 상황에서는 선택 구성으로서가 아니라 단순히 이름을 값에 바인드하는 방법으로 사용되고 있습니다.단, 사용 가능한 언어에서 선택 구성 요소로 자주 사용됩니다.

해시 기반 조건

Python, Perl, PHP 또는 Objective-C같이 연관 배열이나 유사한 데이터 구조를 가진 프로그래밍 언어에서는 조건부 [13]할당을 구현하기 위해 그것들을 사용하는 것이 관례입니다.

애완동물 = 입력("이름 붙일 애완동물의 종류를 입력하세요.") 이미 알고 있다 = {     '개': '피도',     '고양이': '야옹',     '새': '트위티', } my_name = 이미 알고 있다[애완동물] 

어나니머스 함수를 가지거나 프로그래머가 변수 참조에 명명된 함수를 할당할 수 있는 언어에서는 해시를 디스패치 테이블로 사용함으로써 조건부 플로우를 구현할 수 있다.

프레딕션

조건부 분기 명령 대신 술어가 있습니다.프레딕션은 제어 플로우를 변경하는 대신 명령어를 조건부로 실행할 수 있도록 하는 아키텍처 기능입니다.

선택 시스템 상호 참조

이 표는 각 언어의 최신 언어 사양을 나타냅니다.사양이 없는 언어의 경우는, 최신의 정식 릴리스의 실장을 참조해 주세요.

프로그래밍 언어 구조화: 스위치 선택 케이스 산술적 if 패턴[A] 매칭
그리고나서 또 다른 그렇지 않으면
아다 네. 네. 네. 네. 아니요. 아니요.
APL 아니요. 네. 네. 네. 아니요. 아니요.
배쉬 셸 네. 네. 네. 네. 아니요. 네.
C, C++ 아니요. 네. 불필요한[B][C] 폴스루 아니요. 아니요.
C# 아니요. 네. 불필요[B][C]. 네. 아니요. 아니요.
코볼 네. 네. 불필요[C]. 네. 아니요. 아니요.
에펠 네. 네. 네. 네. 아니요. 아니요.
F# 네. 네. 네. 불필요[D]. 아니요. 네.
포트란 90 네. 네. 네. 네. 네, 그렇습니다[G]. 아니요.
가세요 아니요. 네. 불필요[C]. 네. 아니요. 아니요.
하스켈 네. 필요했다 불필요[C]. 네, 하지만 불필요합니다[D]. 아니요. 네.
자바 아니요. 네. 불필요[C]. 폴스루[14] 아니요. 아니요.
ECMAScript(JavaScript) 아니요. 네. 불필요[C]. 폴스루[15] 아니요. 아니요.
매스매티카 아니요. 네. 네. 네. 아니요. 네.
오베론 네. 네. 네. 네. 아니요. 아니요.
아니요. 네. 네. 네. 아니요. 아니요.
PHP 아니요. 네. 네. 폴스루 아니요. 아니요.
Pascal, 객체 Pascal(델파이) 네. 네. 불필요. 네. 아니요. 아니요.
파이썬 아니요. 네. 네. 아니요. 아니요. 네.
QuickBASIC 네. 네. 네. 네. 아니요. 아니요.
루비 네. 네. 네. 네. 아니요. 네, 그렇습니다[H].
아니요. 네. 네. 불필요. 아니요. 네.
스칼라 아니요. 네. 불필요[C]. 폴스루[citation needed] 아니요. 네.
SQL 네, 그렇습니다[F]. 네. 네. 네, 그렇습니다[F]. 아니요. 아니요.
재빠르다 아니요. 네. 네. 네. 아니요. 네.
TCL 아니요. 네. 네. 네. 아니요. 네.
Visual Basic, 클래식 네. 네. 네. 네. 아니요. 아니요.
Visual Basic.그물 네. 네. 네. 네. 아니요. 아니요.
Windows PowerShell 아니요. 네. 네. 폴스루 아니요. 아니요.
  1. ^ 이는 패턴 매칭을 정규 표현식 지원과 같은 단순한 문자열 패턴 매칭 지원과는 달리 프로그래밍 언어의 고유한 조건부 구성이라고 합니다.
  2. 1 2 #ELIF 디렉티브는 프리프로세서서브 언어에서 사용되며 컴파일 전 코드 변경 및 기타 파일 포함에 사용됩니다.
  3. 123456 자주 볼 수 있는 것은else ifC 계열의 언어 및 COBOL 및 Haskell에서는 언어 기능이 아닌 중첩된 독립적 집합입니다.그러나 이는 또한 이러한 언어에서 다른 구성 요소가 실제로 필요하지 않음을 의미합니다.
  4. 1 2 Haskell과 F#에서는 패턴 매칭을 통해 동일한 작업을 수행할 수 있기 때문에 별도의 상수 선택 구성이 필요하지 않습니다.
  5. ^ 인 어 루비caseconstruct, 정규 표현 매칭은 사용 가능한 조건부 흐름 제어의 대체 수단 중 하나입니다.예를 들어, 이 스택오버플로우 질문을 참조해 주세요.
  6. 12 SQL에는 두 가지 역할을 모두 수행하는 두 가지 유사한 구조가 있습니다. 둘 다 SQL-92에 도입되었습니다.검색 완료CASE" 표현CASE WHEN cond1 THEN expr1 WHEN cond2 THEN expr2 [...] ELSE exprDflt END와 같이 동작합니다.if ... else if ... else단, "대화"는CASE" 식:CASE expr WHEN val1 THEN expr1 [...] ELSE exprDflt END스위치 문과 같이 동작합니다.자세한 내용과 예는 Case(SQL)를 참조하십시오.
  7. ^ 산술if포트란 90의 청소년입니다
  8. ^ 패턴 매칭은 루비 3.0에서 추가되었습니다.[16]일부 패턴 매칭 구문은 아직 실험적입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ PHP elseif 구문
  2. ^ Visual Basic ElseIf 구문
  3. ^ POSIX 표준 셸 구문
  4. ^ Haskell 98 언어 및 라이브러리:개정 보고서
  5. ^ 하스켈위키에 대한 If-then-else 제안
  6. ^ "Efficient C Tips #6 – Don't use the ternary operator « Stack Overflow". Embeddedgurus.com. 2009-02-18. Retrieved 2012-09-07.
  7. ^ "New Control Structures". Tcler's wiki. Retrieved August 21, 2020.
  8. ^ "uplevel manual page". www.tcl.tk. Retrieved August 21, 2020.
  9. ^ "if manual page". www.tcl.tk. Retrieved August 21, 2020.
  10. ^ "If and if let expressions". Retrieved November 1, 2020.
  11. ^ "American National Standard Programming Language FORTRAN". 1978-04-03. Archived from the original on 2007-10-11. Retrieved 2007-09-09.
  12. ^ "VisualWorks: Conditional Processing". 2006-12-16. Archived from the original on 2007-10-22. Retrieved 2007-09-09.
  13. ^ "Pythonic way to implement switch/case statements". Archived from the original on 2015-01-20. Retrieved 2015-01-19.
  14. ^ Java.sun.com, Java Language Specification, 제3판.
  15. ^ Ecma-international.org 2015-04-12년 Wayback Machine ECMAScript Language Specification, 제5판 아카이브 완료.
  16. ^ "Pattern Matching". Documentation for Ruby 3.0.

외부 링크