삼항 조건 연산자

Ternary conditional operator

컴퓨터 프로그래밍에서 3차 조건 연산자(ternary conditional operator)는 여러 프로그래밍 언어에서 기본 조건 표현을 위한 구문의 일부인 3차 조건 연산자입니다.일반적으로 조건 연산자, ternary if 또는 인라인 if(약어 if)라고 합니다.a ? b : c로 평가함.b의 가치가 있다면a사실이고, 그렇지 않은 경우.c"만약 a가 되면 c가 아니면 c"라고 소리내어 읽을 수 있습니다.양식a ? b : c는 단연코 가장 일반적이지만 대체 구문이 존재합니다. 예를 들어, Raku는 구문을 사용합니다.a ?? b !! cinfix 연산자와의 혼동을 피하기 위해?그리고.!Visual Basic .NET에서는 대신 형식을 취합니다.If(a, b, c).

이것은 원래 CPL에서 왔으며, 여기서 동등한 구문은 다음과 같습니다.e1 ? e2 : e3이었다e1e2, e3.[1][2]

많은 3항 연산자가 가능하지만, 조건 연산자는 매우 일반적이고 다른 3항 연산자는 매우 드물기 때문에 조건 연산자를 3항 연산자라고 합니다.

변주곡

"삼원 연산자"의 자세한 의미와 구문은 언어마다 크게 다릅니다.

한 언어에서 다른 언어로의 최상위 차이는 표현식이 부작용을 허용하는지 여부(대부분의 절차 언어에서처럼)와 선택한 표현식만 평가되는 단락 평가 의미론을 제공하는지 여부입니다(대부분의 언어에서 대부분의 표준 연산자가 모든 인수를 평가함).

언어가 부작용이 있는 표현식을 지원하지만 단락 평가를 지정하지 않는 경우, 언어가 특정 순서를 보장하는 경우(조건도 표현식으로 계산됨) 어떤 표현식이 먼저 평가되는지에 대한 추가 구분이 존재합니다.

게다가, 순서가 보장되지 않는 경우, 결과가 불확실(일부 순서에서 얻은 값)으로 분류되는지, 아니면 정의되지 않은(부작용이나 충돌에 직면한 컴파일러의 변덕에 의한 임의의 값)지에 대한 구별이 존재합니다.

만약 언어가 (기능적 언어에서 공통적으로) 부작용을 허용하지 않는다면, 평가 순서는 의미론적 가치가 없습니다. 그러나 무한 재귀가 종료되는지 또는 다른 성능 영향을 미칠 수 있습니다(일치하는 표현이 있는 기능적 언어에서는 단락 평가가 내재되어 있음).그리고 삼원 연산자에 대한 자연적인 사용은 덜 자주 발생하기 때문에 이 점은 제한적입니다.)

이러한 이유로 일부 언어에서는 문 양식이variable = condition ? expr1 : expr2;블록 조건부 형식과 미묘하게 다른 의미를 가질 수 있습니다.if (condition) { variable = expr1; } else { variable = expr2;(C 언어(지정된 예의 구문)에서는 이들은 사실상 동일합니다.

중첩된 3항 연산자의 연관성도 언어마다 다를 수 있습니다.거의 모든 언어에서, 삼원 연산자는 올바른 연상이므로,a == 1 ? "one" : a == 2 ? "two" : "many"직관적으로 평가합니다.a == 1 ? "one" : (a == 2 ? "two" : "many")그러나 특히 PHP는 악명높게 [3]왼쪽 연관성이 있으며, 다음과 같이 평가합니다.(a == 1 ? "one" : a == 2) ? "two" : "many"이것은 어떤 프로그래머도 거의 기대하지 않는 것입니다.( 주어진 예는 3항 연산자가 낮은 연산자 우선순위를 가지고 있다고 가정합니다. 이는 모든 C 계열 언어와 많은 다른 언어에서 해당됩니다.)

지도에 대한 동등성

3차 연산자는 이진 맵 연산으로도 볼 수 있습니다.

R(및 문자 그대로의 표현식 튜플이 있는 다른 언어)에서는 R 표현식과 같은 것으로 3진 연산자를 시뮬레이션할 수 있습니다.c(expr1,expr2)[1+condition](0-원점 첨자가 있는 언어에서는 이 관용구가 약간 더 자연스럽다) 중첩된 3원점은 다음과 같이 시뮬레이션될 수 있습니다.c(expr1,expr2,expr3)[which.first((c(cond1,cond2,TRUE))]기능이 있는 곳which.first조건 벡터에서 첫 번째 참 값의 인덱스를 반환합니다.이 두 맵 등가물은 모두 이진 연산자이며, 3진 연산자가 의미론이 아닌 구문에서 3진 연산자임을 나타냅니다.이러한 구성은 함수 구성이 아닌 데이터 연결을 기반으로 하는 약한 형태의 카레로 간주될 수 있습니다.

언어가 미래 또는 약속의 메커니즘을 제공하는 경우, 단락 평가는 이진 맵 작업의 맥락에서 시뮬레이션될 수도 있습니다.

조건부 할당

?:는 다음과 같이 사용됩니다.

조건 ? value_if_true : value_if_false

조건부울식으로 true 또는 false로 평가됩니다.부울 조건 평가를 기반으로 조건이 이면 전체 식이 value_if_true를 반환하지만 그렇지 않으면 value_if_false를 반환합니다.일반적으로 두 하위 표현식 value_if_truevalue_if_false는 전체 표현식의 유형을 결정하는 동일한 유형을 가져야 합니다.이 유형 검사의 중요성은 작업자가 가장 일반적으로 사용하는 조건부 할당 문에 있습니다.이 사용법에서는 다음과 같이 할당 문 오른쪽에 식을 표시합니다.

변수 = 조건 ? value_if_true : value_if_false

?: 연산자는 Scheme, MLHaskell같은 함수형 프로그래밍 언어에서 조건부 표현식(if-then-else 구성)이 작동하는 방식과 유사합니다. if-then-else는 해당 언어에서 문 대신 표현식을 형성하기 때문입니다.

사용.

조건 연산자의 가장 일반적인 용도는 간결한 조건부 할당 문을 만드는 것입니다.예를 들어, 우리가 상점의 정상적인 영업 시간을 9시에서 일요일 12시로 변경하기 위해 C 코드를 구현하고 싶다면, 우리는 다음을 사용할 수 있습니다.

인트 개장 시간 = (낮의 == 일요일.) ? 12 : 9; 

더 장황한 것 대신에

인트 개장 시간;  한다면 (낮의 == 일요일.)     개장 시간 = 12; 또 다른     개장 시간 = 9; 

두 가지 형태는 거의 같습니다.기억하십시오.?:는 식이고 if-then-ten은 문입니다.구문 분석 시 오류 보고서 없이 조건부 연산자에서 또는 거짓 부분을 생략할 수 없습니다.이는 else 절을 생략할 수 있는 if-then-else 문과 대조됩니다.

함수형 프로그래밍을 강조하는 대부분의 언어는 처음부터 정규 조건식이 표현이므로 연산자가 필요하지 않습니다. 예를 들어, Scheme 표현식입니다.(if (> a b) a b)의미론적으로 C 표현식과 같습니다.(a > b) ? a : b이것은 또한 쓰기가 가능한 ALGOL을 시작으로 많은 명령어에서도 마찬가지입니다.result := if a > b then a else b또는 Smalltalk)result := (a > b) ifTrue: [ a ] ifFalse: [ b ]) 또는 루비(result = if a > b then a else b end,비록 ~일지라도result = a > b ? a : b작동하기도 함).

변수에 하나 또는 다른 하나만 할당되더라도 일부 언어는 참-표현식과 거짓 표현식을 모두 평가할 수 있습니다.이는 true-또는 false-표현식에 함수 호출이 포함되어 있으면 결과의 사용 여부와 관계없이 함수가 호출되고 실행될 수 있음을 의미합니다.프로그래머는 프로그래밍 언어 사양을 참조하거나 3차 연산자를 테스트하여 언어가 이러한 방식으로 두 표현을 모두 평가할지 여부를 결정해야 합니다.만약 그렇다면, 그리고 이것이 원하는 동작이 아니라면, if-then-else 문을 사용해야 합니다.

액션스크립트 3

조건. ? value_if_true : value_if_false 

에이다

에이다 2012년판에는 조건부 표현이 도입되었습니다(사용).if그리고.case), 정량화된 표현식 및 표현 함수를 포함한 확장된 표현식 집합의 일부로 사용됩니다.2012년 Ada의[4] 이론적 근거는 Ada가 이전에 그러한 것들을 가지고 있지 않았던 동기와 "계약"(또한 새로운 것)을 지원하는 것과 같이 현재 그것들을 추가한 동기를 명시합니다.

페이_퍼_시간 := (한다면 데이 = 일요일.    그리고나서 12.50    또 다른 10.00); 

if_expression의 값이 부울 형식일 때,else값이 True인 경우 부품을 생략할 수 있습니다.다음을 사용하여 여러 조건이 연결될 수 있습니다.elsif.

알골 68

ALGOL 68의 선택 절(ifcase 절)은 "굵은" 구문 또는 "간단한" 형식 중 하나를 코더에 제공합니다.

  • 단일 if 선택 절:
if 조건이 되면 statements [else statements ] fi "filename" 형식: (조건 설명문)
  • 선택 절인 경우 연결됨:
if condition1 다음에 statements elif condition2 다음에 statements [else statements ] fi "discovery" 형식: (condition1 statements : condition2 statements )

APL

다음 구문을 사용하여 두 식을 모두 평가합니다(으)로value_if_false먼저 평가한 다음,condition,그리고나서value_if_false):

결과  value_if_true  조건.  value_if_false 

이 대체 구문은 단락 평가를 제공합니다.

결과  { 조건. : 식_if_true  식_if_false }  

AWK

결과 = 조건. ? value_if_true : value_if_false 

바시

참 3항 연산자는 산술식에만 존재합니다.

((결과 = 조건 ? value_if_true : value_if_false) 

문자열의 경우 다음과 같은 해결 방법만 있습니다.

결과=$([[ "a달러" = "$b" ]] && 메아리치다 "value_if_true"    메아리치다 "value_if_false") 

어디에"$a" = "$b"모든 조건이 될 수 있습니다.[[ … ]]구성이 평가할 수 있습니다.대신에[[ … ]]다른 bash 명령이 있을 수 있습니다.성공적으로 종료되면 첫 번째 에코 명령이 실행되고, 그렇지 않으면 두 번째 에코 명령이 실행됩니다.

C

C의 전통적인 if-else 구조는 다음과 같습니다.

한다면 (a > b) {     결과 = x; } 또 다른 {     결과 = y; } 

이것은 다음 문장으로 다시 작성할 수 있습니다.

결과 = a > b ? x : y; 

if-else 구문에서와 같이 표현식 'x'와 'y' 중 하나만 평가됩니다.이는 'x' 또는 'y'의 평가에 부작용[5]있는 경우에 유의합니다.조건 연산자의 결과를 l [5]값으로 사용하려는 경우 동작이 정의되지 않습니다.

C로의 GNU 확장은 두 번째 피연산자를 생략할 수 있으며, 암시적으로 첫 번째 피연산자를 두 번째 피연산자로 사용할 수도 있습니다.

a == x ? : y; 

식은 다음과 같습니다.

a == x ? (a == x) : y; 

x가 식인 경우에는 한 번만 평가됩니다.식을 평가하는 것이 부작용이 있으면 차이가 큽니다.이 속기 형태는 때때로 다른 언어로 엘비스 연산자로 알려져 있습니다.

C#

C#에서 조건이 참이면 첫 번째 식이 평가되어 결과가 되고, 거짓이면 두 번째 식이 평가되어 결과가 됩니다.Java와 마찬가지로 두 식 중 하나만 평가됩니다.

조건 ?first_consection : second_consection;  정적인 갑절의 인후(갑절의 x)  {      돌아가다 x != 0.0 ? 수학.(x) / x : 1.0; } 

C++

C와 달리, 의 우선 순위는?:C++의 연산자는 할당 연산자의 연산자와 동일합니다(=또는OP=)를 선택하면 [6]값을 반환할 수 있습니다.이것은 다음과 같은 표현을 의미합니다.q ? a : b = c그리고.(q ? a : b) = c둘 다 합법적이고 다르게 해석됩니다. 전자는 다음과 같습니다.q ? a : (b = c).

C++에서는 if-else 문을 사용하는 것이 불가능한 조건부 할당 상황이 있습니다. 이 언어는 초기화할당을 명시적으로 구분하기 때문입니다.이러한 경우 항상 함수 호출을 사용할 수 있지만, 이는 번거롭고 품위가 없을 수 있습니다.예를 들어, 필드 또는 기본 클래스의 생성자에 대한 인수로 조건부로 다른 값을 전달하려면 일반 if-else 문을 사용할 수 없습니다. 이 경우 조건부 할당 식을 사용하거나 함수 호출을 사용할 수 있습니다.또한 일부 유형은 초기화를 허용하지만 할당은 허용하지 않으며, 할당 연산자와 생성자가 완전히 다른 작업을 수행한다는 점에 유의하십시오.이 마지막은 다음과 같은 참조 유형에 해당됩니다.

#오페라의 <iosstream> #오페라의 <fstream> #오페라의 <string>  인트 주된(인트 호형의,  *아르그브[]) {     표준의:: 이름.;     표준의::상류의 외출 중인;      한다면 (호형의 > 1 && 아르그브[1])     {         이름. = 아르그브[1];         외출 중인.열다.(이름..c_str(), 표준의::이오스::나가.   표준의::이오스::앱.);     }      표준의::오스트림 &남쪽의 = 이름..() ? 표준의::꾸뛰드 : 외출 중인;      남쪽의 << "안녕, 세상이여!\n";      돌아가다 0; } 

이 경우에는 다음을 대신하여 if-else 문을 사용할 가능성이 없습니다.?:연산자(비록 우리가 사용을 대체할 수 있지만)?:함수 호출을 포함하며, 그 안에는 if-sublic 문이 있을 수 있습니다.).

또한 조건부 연산자는 l 값, 즉 다른 값이 할당될 수 있는 값을 산출할 수 있습니다.다음 예를 생각해 보십시오.

#오페라의 <iosstream>  인트 주된(인트 호형의,  *아르그브[])  {     인트 a = 0;     인트 b = 0;      (호형의 > 1 ? a : b) = 1;      표준의::꾸뛰드 << "a: " << a               << b: " << b               << '\n';      돌아가다 0; } 

이 예에서는 부울식이argc > 1값을 산출합니다.true8행에서, 그 값.1변수에 할당됨a그렇지 않으면 가치가.1변수에 할당됨b.

C++ 및 기타 다양한 언어에서 3진 연산자는 다음과 같습니다.a > b > c또한 가능하지만 매우 희귀합니다.

CFML

의 예?:CFML의 연산자:

결과 = rand 범위(0,1) ? "헤드" : "꼬리"; 

대략 50%의 시간이randRange()식은 1(true) 또는 0(false)을 반환합니다. 즉, 결과는 "heads" 또는 "tails" 값을 각각 사용합니다.

Lucee, Railo 및 ColdFusion 11 관련

Lucee, Railo, 그리고 ColdFusion 11 또한 Elvis 연산자를 구현합니다.?:이 값은 식이 지정되지 않은 경우 식의 값을 반환하며, 그렇지 않은 경우 지정된 기본값을 반환합니다.

구문:

결과 = 표현 ?: value_if_retion_is_retension_interval 

예:

결과 = f() ?: "기본값";  어디서... 기능. f(){     한다면 (rand 범위(0,1)){ 0 또는 1(거짓/참)         돌아가다 "값";     } }  쓰기 출력(결과); 

함수f()돌아올 것입니다value약 50%의 시간, 그렇지 않으면 아무것도 돌려주지 않을 것입니다.한다면f()"값"을 반환합니다.result이 값을 사용하고, 그렇지 않으면 "default" 값을 사용합니다.

커피스크립트

CoffeeScript에서 이 연산자를 사용하는 예:

한다면 1 이라 2 그리고나서 "진정한 가치" 또 다른 "false value 

"false value"를 반환합니다.

커먼 리스프

Common Lisp에서 조건식을 사용한 할당:

(setq 결과 (한다면 (> a b) x y)) 

대체 양식:

(한다면 (> a b)   (setq 결과 x)   (setq 결과 y)) 

크리스털

Crystal에서 이 연산자를 사용하는 예:

1 == 2 ? "진정한 가치" : "false value 

돌아온다"false value".

Crystal 컴파일러는 조건 연산자를 다음으로 변환합니다.if따라서 위의 표현은 의미적으로 다음과 같습니다.

한다면 1 == 2   "진정한 가치" 또 다른   "false value 끝. 

다트

Dart 프로그래밍 언어의 구문은 주로 Java, C# 및 JavaScript와 같은 언어에서 영감을 받아 C 계열에 속하며, 이는 전통적인 언어를 이어받았음을 의미합니다.?:조건식의 구문입니다.

예:

돌아가다 x.짝수 ? x ~/ 2 : x * 3 + 1; 

다트의 다른 조건들과 마찬가지로, 앞의 표현은?부울 값으로 계산해야 합니다.

Dart 구문은 두 가지를 모두 사용합니다.?그리고.:언어 문법의 모호성을 야기하는 다양한 다른 방법들로.다음과 같은 표현식:

{ x ~하듯이 T ? [1] : [2] } 

의 목록 중 하나를 포함하는 "세트 리터럴" 또는 "맵 리터럴"로 구문 분석할 수 있습니다.{((x as T?)[1]) : [2]}언어는 항상 그러한 상황에서 조건부 표현을 선택합니다.

다트는 또한 두 번째 3차 연산자인[]=목록이나 지도에서 값을 설정하는 데 일반적으로 사용되는 연산자로, "3차 연산자"라는 용어를 다트 맥락에서 모호하게 만듭니다.

델파이

델파이에서IfThen기능은 다음과 같은 것을 달성하는 데 사용될 수 있습니다.?:만약에System.Math라이브러리가 사용됩니다.IfThenfunction은 정수, 이중 또는 확장과 같은 숫자 값을 반환합니다.만약에System.StrUtils라이브러리가 사용되며, 이 함수는 문자열 값을 반환할 수도 있습니다.

사용.System.Math

기능. 이프 더(가치: 부울; 컨스 진실: 정수; 컨스 거짓: 정수): 정수; 기능. 이프 더(가치: 부울; 컨스 진실: Int64; 컨스 거짓: Int64): Int64; 기능. 이프 더(가치: 부울; 컨스 진실: Unt64; 컨스 거짓: Unt64): Unt64; 기능. 이프 더(가치: 부울; 컨스 진실: 싱글; 컨스 거짓: 싱글): 싱글; 기능. 이프 더(가치: 부울; 컨스 진실: 더블; 컨스 거짓: 더블): 더블; 기능. 이프 더(가치: 부울; 컨스 진실: 확장된; 컨스 거짓: 확장된): 확장된; 

사용System.StrUtils도서관

기능. 이프 더(가치: 부울; 컨스 진실: ; 거짓:  = ''): ; 

사용 예:

기능. 시작 시간 가져오기(평일: 정수): 정수; 시작한다.   이 함수는 지정된 평일의 시작 시간을 반환합니다. 일요일의 경우 12시간, 기타 요일의 경우 9시간 }을(를) 반환합니다.   결과 := 이프 더((평일 = 1) 또는 (평일 = 7), 12, 9); 끝.; 

그러나 실제 3항 연산자와 달리 두 결과는 비교를 수행하기 전에 평가됩니다.예를 들어, 결과 중 하나가 데이터베이스 테이블에 행을 삽입하는 함수에 대한 호출인 경우, 해당 함수는 특정 결과를 반환하는 조건이 충족되는지 여부에 관계없이 호출됩니다.

F#

F#에서 if-then-else에 대한 기본 제공 구문은 이미 항상 값을 반환해야 하는 식입니다.

허락하다 번호 = 한다면 x = 10 그리고나서 42 또 다른 24 

F#에는 반환 값이 단위 유형인 경우 else 분기를 생략할 수 있는 특수한 경우가 있습니다.이렇게 하면 다른 분기를 사용하지 않고 부작용을 수행할 수 있습니다.

한다면 x = 10 그리고나서     printfn "10입니다." 

그러나 이 경우에도 if 식은 단위를 반환합니다.컴파일러가 other의 단위 유형을 가정하기 때문에 other 브랜치를 작성할 필요가 없습니다.

포워드

FORT는 스택 지향 언어이며, 어떤 식이든 스택에 값을 남길 수 있기 때문에,IF/ELSE/THEN시퀀스는 값을 생성할 수 있습니다.

: 시험 ( n -- n )  1 그리고.  한다면 22 또 다른 42 그리고나서 ; 

이 단어는 스택에 1개의 매개 변수를 사용하고, 해당 숫자가 홀수이면 22개를 남깁니다.짝수일 경우 42개가 스택에 남아 있습니다.

포트란

1995년 릴리스에서 코드에 추가되면서 3차 연산자가 포트란 컴파일러에 내장 함수로 추가되었습니다.merge:

변수 = 합병하다(x,y,a>b) 

x와 y는 둘 중 하나의 결과가 함수에서 반환되기 전에 평가됩니다.여기서 조건이 참이면 x가 반환되고 그렇지 않으면 y가 반환됩니다.

프리마커

이 기본 제공 기능은 FreeMarker 2.3.20 이후에 존재합니다.

처럼 사용됨booleanExp?then(whenTrue, whenFalse)C와 유사한 언어에서 3차 연산자와 동일한 역할을 수행합니다.

<#timeout x = 10> <#timeout y = 20> <#-- x와 y의 최대값 인쇄: --> ${(x > y)?그러면 (x, y)}

가세요

Go에 있으면 ternary가 없으므로 full if 문을 항상 [7]사용해야 합니다.

하스켈

기본 제공 if-then-else 구문은 인라인입니다. 식

한다면 술어 그리고나서 expr1 또 다른 expr2 

활자가 있음

부울 -> a -> a -> a 

기본 라이브러리는 또한 기능을 제공합니다.Data.Bool.bool:

쿨한 :: a -> a -> 부울 -> a 

기본적으로 Haskell은 엄격하지 않기 때문에 두 경우 모두 선택한 식을 평가하기 위해 특별한 처리가 필요하지 않습니다.이것은 또한 연산자가 다음과 같이 정의될 수 있음을 의미합니다.$연산자, 함수는 정확히 다음과 같습니다.?:대부분의 언어:

(?) :: 부울 -> a -> a -> a (?) 이전의 x y = 한다면 이전의 그리고나서 x 또 다른 y infix 1 ?  예(차량이 "평가"됨): 아그 = 'A' 차량 = 아그 == 'B' ? "보트" $           아그 == 'A' ? "스캐너덜너덜 $           아그 == 'T' ? "열차" $                        "자동차" 

그러나 패턴 가드를 사용하는 것이 더 관용적입니다.

예(차량이 "평가"됨): 아그 = 'A' 차량   아그 == 'B' = "보트"           아그 == 'A' = "스캐너덜너덜           아그 == 'T' = "열차"           그렇지않으면  = "자동차" 

자바

Java에서 이 표현식은 다음을 평가합니다.

foo를 선택한 경우 선택한 foo를 막대에 할당합니다.그렇지 않으면 막대에 baz를 할당합니다. 물건  = .선택됨() ?  : 광란의; 

Java는 C#과 유사한 방식으로 사용된 식을 평가할 뿐 사용되지 않은 [8]식을 평가하지 않습니다.

줄리아.

Julia에서, "주목할 수 있는 공간은?그리고.:필수 사항: 다음과 같은 식을 사용a?b:c유효한 3항식이 아닙니다(그러나 두 개의 행 모두 다음에 새 행이 허용됩니다).?그리고:)."[9]

자바스크립트

JavaScript의 조건부 연산자는 C++ Java의 연산자와 유사하지만 중간 표현식은 쉼표 표현식이 될 수 없습니다.또한 C++에서처럼 CPerl과 달리 오른쪽에 있는 할당보다 더 엄격하게 바인딩되지 않습니다.q ? a : b = c와 동등합니다.q ? a : (b = c)대신에(q ? a : b) = c.[10]

넝쿨 타임아웃 = 설정 === 무효의 ? 1000 : 설정.타임아웃; 

C# 및 Java와 마찬가지로 식이 지정된 조건에 일치하는 경우에만 식이 평가되고, 다른 식은 평가되지 않습니다.

코틀린

코틀린은 전통적인 것을 포함하지 않습니다.?:그러나 3진 연산자,ifs를 [11]할당할 수 있는 식으로 사용하여 동일한 결과를 얻을 수 있습니다.한 사람의 조건부 진술의 복잡성이 증가함에 따라 프로그래머는 그들의 진술을 대체하는 것을 고려할 수 있습니다.if-else으로 표현.when표현.

 맥스. = 한다면 (a > b) a 또 다른 b 

루아

Lua에는 전통적인 조건부 연산자가 없습니다.그러나, 그것의 단락 동작.and그리고.or연산자는 이 동작의 에뮬레이션을 허용합니다.

var = cond ? a : b;와 동등한 값 넝쿨 = 두 번째의 그리고. a 또는 b 

그렇지 않으면 성공할 것입니다.a논리적으로 거짓입니다(즉,false또는nil); 이 경우, 표현식은 항상 다음과 같은 결과를 낳을 것입니다.b이로 인해 무시할 경우 몇 가지 놀라운 동작이 발생할 수 있습니다.

사용할 수 있는 다른 변형도 있지만 일반적으로 더 자세한 내용은 다음과 같습니다.

테이블 리터럴 주위의 괄호가 필요합니다. 넝쿨 = (   {     [진실의] = a,     [거짓의] = b   } )[것은 아니다. 것은 아니다. 두 번째의] 

루아의 방언인 루아우는 마치 진술하는 것처럼 보이는 삼원형의 표현을 가지고 있지만, 그들과는 달리, 그것들은 없습니다.end키워드, 그리고else절이 필요합니다.선택적으로 추가할 수 있습니다.elseif조항그것은 그것을 대체하도록 설계되었습니다.cond and a or b관용구이며 모든 [12]경우에 제대로 작동할 것으로 예상됩니다.

루아우에서 넝쿨 = 한다면 두 번째의 그리고나서 a 또 다른 b  elseif 조항이 있는 서명하다 = 한다면 넝쿨 < 0 그리고나서 -1 그렇지 않으면 넝쿨 == 0 그리고나서 0 또 다른 1 

목표-C

조건 ? value_if_true : value_if_false

인트  = (1 < 2) ? 1 : 2; 

그러면 변수가 설정됩니다.min로.1그 상태 때문에(1 < 2)이라true.

의 전통적인 if-else 구조는 다음과 같습니다.

한다면 (a달러 > $b) {     $결과 = x달러; } 또 다른 {     $결과 = $y의; } 

조건 연산자를 사용하도록 다시 작성됨:

$결과 = a달러 > $b ? x달러 : $y의; 

Perl에서 조건 연산자의 우선 순위는 C++에서가 아니라 C와 동일합니다.이는 콤마 연산자보다 편리하게 우선 순위가 높지만 3차 연산자 내 식에 사용되는 대부분의 연산자의 우선 순위보다 낮으므로 괄호를 사용할 [13]필요가 거의 없습니다.

그것의 연관성은 PHP의 연관성이 아니라 C와 C++의 연관성과 일치합니다.C와는 달리 C++과는 달리 펄은 L [14]으로 조건식을 사용할 수 있습니다.

a달러 > $b ? x달러 : $y의 = $결과; 

할당할 것입니다.$result둘 중 어느 쪽이든$x또는$y논리식의 부울 결과에 따라 달라집니다.

사용된 연산자의 각 우선 순위 규칙 및 연관성은 괄호가 없는 버전이 명시적으로 괄호가 있는 버전과 동일하다는 것을 보장합니다.

((a달러 > $b) ? x달러 : $y의) = $결과; 

이는 if-else 버전과 동일합니다.

한다면 (a달러 > $b) {     x달러 = $결과; } 또 다른 {     $y의 = $결과; } 

PHP

간단한 PHP 구현은 다음과 같습니다.

$abs = $value >= 0 ? $value : -$value; 

대부분의 다른 프로그래밍 언어와 달리, PHP의 조건 연산자는 오른쪽 연관성이 아닌 왼쪽 연관성입니다.따라서, arg대한 T 값이 주어지면,[15] 다음 예제의 PHP 코드는 예상대로 train 대신 value horse를 산출할 수 있습니다.

<?>의 $arg = "T"; $차량 = ( ( $arg == 'B' ) ? '버스' :               ( $arg == 'A' ) ? '''비공식''' :               ( $arg == 'T' ) ? '기차' :               ( $arg == 'C' ) ? '차' :               ( $arg == 'H' ) ? '말' :                                 '''비공식''' ); 메아리치다 $차량; 

그 이유는 두 조건부 연산자를 중첩하면 마지막 두 옵션이 분기로 지정된 초과 조건이 생성되기 때문입니다.c1 ? o1 : c2 ? o2 : o3정말로((c1 ? o1 : c2) ? o2 : o3)이것은 승인되었으며[16] 아마도 [17]변경되지 않을 것입니다.이를 방지하려면 다음 예와 같이 중첩된 괄호가 필요합니다.

<?>의 $arg = "T"; $차량 = $arg == "B" ? "버스" :           ($arg == "A" ? "스캐너덜너덜 :           ($arg == "T" ? "열차" :           ($arg == "C" ? "자동차" :           ($arg == "H" ? "말" :                          "스캐너덜너덜)))); 메아리치다 $차량; 

이렇게 하면 열차가 출력물에 출력되는 결과가 생성됩니다. 이는 우측 연관 조건부 연산자와 유사합니다.

파이썬

구문에 대한 의견 불일치로 인해 몇 년 동안 지연되었지만 Python의 조건부 표현에 대한 연산자는 Python Enhancement Proposal 308로 승인되었으며 2006년 9월 2.5 릴리스에 추가되었습니다.Python의 조건 연산자가 공통 연산자와 다릅니다.?:연산자가 피연산자 순서대로 표시됩니다.일반적인 형태는 [18]다음과 같습니다.

결과 = x 한다면 a > b 또 다른 y 

이 양식은 다음을 고려하여 초대됩니다.x정상값으로서 그리고y예외적인 경우로서

Python 2.5 이전에는 (예를 들어 두 개의 요소 배열로 인덱싱하여) 조건부 연산자를 근사화하는 여러 가지 방법이 있었지만, 이 모든 것은 내장 연산자와 비교할 때 단점이 있습니다.

R

R(S의 구현체)의 전통적인 if-else 구조는 다음과 같습니다.

한다면(a < b) {   x <- "참" } 또 다른 {   x <- "거짓" } 

각 블록에 문이 하나만 있는 경우 C: 같이 중괄호를 생략할 수 있습니다.

한다면(a < b)   x <- "참" 또 다른   x <- "거짓" 

위의 코드는 다음과 같은 비표준 축약 방식으로 작성할 수 있습니다.

x <- 한다면(a < b) "참" 또 다른 "거짓" 

함수도 존재합니다.ifelse위의 식을 다음과 같이 다시 쓸 수 있습니다.

x <- 그렇지 않은(a < b, "참", "거짓") 

ifelse함수가 자동으로 벡터화됩니다.예를 들어:

>그렇지 않은(c (0, 2) < 1, "참", "거짓") "true" "false" 

라쿠

라쿠는 더블을 사용합니다.??단일 대신 기호?두 배로!!대신 기호를 표시합니다.:[19]

$결과 = a달러 > $b ?? x달러 !! $y의; 

루비

Ruby에서 이 연산자를 사용하는 예:

1 == 2 ? "진정한 가치" : "false value 

"false value"를 반환합니다.

루비의 전통적인 if-else 구조는 [20]다음과 같습니다.

한다면 a > b   결과 = x 또 다른   결과 = y 끝. 

이는 다음과 같이 기록될 수도 있습니다.

결과 = 한다면 a > b   x 또 다른   y 끝. 

다음 문장으로 다시 작성할 수 있습니다.

결과 = a > b ? x : y 

러스트

표현 중심의 프로그래밍 언어인 Rust의 기존if expr1 else expr2구문은 전통적인 것처럼 행동할 수 있습니다.?:3진 연산자가 합니다.그 언어의 초기 버전들은 가지고 있었습니다.?:연산자 그러나 중복으로 인해[21] 제거되었습니다.if.[22]

보다 선언적인 코드에 비해 아래 코드에 세미콜론이 부족합니다.if...else블록, 그리고 과제의 끝에 있는 세미-슬립.y.

허락하다 x = 5;  허락하다 y = 한다면 x == 5 {     10 } 또 다른 {     15 }; 

이는 다음과 같이 기록될 수도 있습니다.

허락하다 y = 한다면 x == 5 { 10 } 또 다른 { 15 }; 

러스트 조건식에서는 물결 괄호가 필수입니다.

사용할 수도 있습니다.match식:

허락하다 y = 경기 x {     5 => 10,     _ => 15, }; 

계획

Common Lisp와 동일합니다.모든 식에는 값이 있습니다.따라서 기본 제공되는if사용 가능:

(셋* ((x 5)        (y (한다면 (= x 5) 10 15)))   ...) 

잡담

모든 식(메시지 전송)에는 값이 있습니다.따라서ifTrue:ifFalse:사용 가능:

 x y   x := 5. y := (x == 5) 참인 경우:[10] 거짓인 경우:[15]. 

SQL

SQLCASE식은 3항 연산자의 일반화입니다.하나의 조건부 결과와 두 개의 결과 대신 n개의 조건부 결과와 n+1개의 결과를 지정할 수 있습니다.

하나의 조건부를 사용하면 3항 연산자와 동일(더 상세하지만)합니다.

선택한다. (사례. 언제 a > b 그리고나서 x 또 다른 y 끝.) ~하듯이 조건_예시   부터 ; 

이는 다음과 같은 몇 가지 조건으로 확장할 수 있습니다.

선택한다. (사례. 언제 a > b 그리고나서 x 언제 a < b 그리고나서 y 또 다른 z 끝.) ~하듯이 조건_예시   부터 ; 

MySQL

표준 외에CASE표현식, MySQL이 제공하는IF확장 기능:

한다면(두 번째의, a, b); 

SQL 서버

표준 외에CASE표현식, SQL Server(2012년부터)는IIF함수:

IIF(조건., true_value, false_value) 

오라클 SQL

표준 외에CASEexpression, Oracle에는 스위치 문과 유사하게 작동하는 가변 함수 대응물이 있으며 동일성을 테스트할 때 조건 연산자를 에뮬레이트하는 데 사용할 수 있습니다.

일반 구문에서는 식과 비교하여 대소문자-결과 쌍을 사용한 다음 폴백 결과를 사용합니다. 디코드(표현, 사례 1, 결과1,                    ...                    대소문자, 결과 N,                           결과 기타)  조건 연산자는 다음과 같은 경우를 하나만 선택하여 에뮬레이트할 수 있습니다. 디코드(표현, 조건., 진실의, 거짓의) 

DECODE기능은 오늘날 표준을 위해 더 이상 사용되지 않습니다.CASE표현.이는 Oracle SQL 쿼리와 PL/SQL 블록 모두에서 사용할 수 있지만,decode전자에서만 사용할 수 있습니다.

스위프트

스위프트의 3차 조건 연산자는 C 전통의 일반적인 방식으로 작성되며 표현식 내에서 사용됩니다.

허락하다 결과 = a > b ? a : b 

Tcl

Tcl에서 이 연산자는 다음에서 사용할 수 있습니다.expr식만:

set x 5 set y [expr {$x == 5 ? 10:15}]

외부expr,if다음과 같은 값을 반환하므로 유사한 용도로 사용할 수 있습니다.

패키지에는 수학 세트 x 5 set y가 필요합니다 [만약 {$x == 5} {:math::math $x } 그렇지 않으면 {:math::mathonacci $x}].

테스트 스탠드

National Instruments Test Stand 식에서 조건이 참이면 첫 번째 식이 평가되어 조건부 작동의 출력이 되고, 거짓이면 두 번째 식이 평가되어 결과가 됩니다.두 식 중 하나만 평가됩니다.

조건. ? 첫 번째_표현 : 제이의 표현 

예:

실행 상태.뿌리.매개변수.테스트 소켓.색인 == 3 ? 현지인.UUT 인덱스 = 3 : 현지인.UUT 인덱스 = 0 

설정합니다.UUTIndex로컬 변수가 3인 경우TestSocket.Index3입니다. 그렇지 않으면 설정됩니다.UUTIndex0까지

다른 언어들과 마찬가지로 first_expressionsecond_expression은 독립적인 표현식일 필요가 없으므로 변수 할당에 연산자를 사용할 수 있습니다.

현지인.UUT 인덱스 = ( 실행 상태.뿌리.매개변수.테스트 소켓.색인 == 3 ? 3 : 0 ) 

베리로그

Verilog는 기술적으로 하드웨어 기술 언어이며 프로그래밍 언어가 아닙니다. 두 언어의 의미는 매우 유사합니다.를 사용합니다.?:3항 연산자에 대한 구문입니다.

차단 할당 사용 철사를 치다 나가.; 할당하다 나가. =  ? a : b; 

이는 보다 상세한 Verilog 코드에 해당합니다.

차단 할당 사용 철사를 치다 나가.; 한다면 ( === 1)  sel은 0이 아닌 1, x 또는 z입니다.     할당하다 나가. = a; 또 다른 한다면 ( === 0)  sel은 0, x 또는 z입니다(위에서 1번 선택).     할당하다 나가. = b; 또 다른  selis x 또는 z(위의 0 및 1 확인)     할당하다 나가. = [댓글];  a와 b를 조금씩 비교하고, 각 비트에 대한 반환                              비트가 다르면 x, 동일하면 비트 값 

비주얼 베이직

Visual Basic에서 사용하지 않음?:그 자체로, 하지만 이 속기의 구현이 매우 유사합니다.if...else진술.이 문서에 제공된 첫 번째 예를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

변수 = IIf(조건, value_if_true, value_if_false)  개장 시간 ~하듯이 정수 = IIf((낮의 = 일요일.), 12, 9) 

위의 예에서,IIf는 3항 함수이지만 3항 연산자는 아닙니다.함수로서 함수 호출이 발생하기 전에 세 부분의 값이 모두 평가됩니다.이것은 Visual Basic에서 제한을 부과했습니다.Net 9.0은 Visual Studio 2008과 함께 출시되었으며 실제 조건부 연산자가 도입되었습니다.If키워드 대신 사용IIf이를 통해 다음 예제 코드가 작동할 수 있습니다.

 이름. ~하듯이  = 한다면(사람인 아이즈 아무 것도 없어요., "", 사람인.이름.) 

사용.IIf,person.Name사용자가 (없음)인 경우에도 평가되어 예외가 발생합니다.진정한 합선 조건부 연산자를 사용하면,person.Name사람이 아닌 경우를 제외하고는 평가되지 않습니다.null.

Visual Basic Version 9에 연산자가 추가되었습니다.If()기존에 더하여IIf()이전에 존재했던 함수입니다.진정한 운영자로서, 그것은 부작용과 잠재적인 비효율성을 가지고 있지 않습니다.IIf()기능.

토큰의 구문은 다음과 같습니다.If([condition], op1, op2)IIf(condition, op1, op2)위에서 언급한 바와 같이, 함수 호출은 Visual Basic의 함수 호출 평가 전략에 따라 모든 하위 표현식을 평가해야 하며 결과는 항상 VB(유형 변형) 또는 VB.NET(개체)가 될 것이기 때문에 상당한 단점이 있습니다.If()그러나 연산자는 조건부 평가를 지원하고 피연산자의 유형을 기반으로 식의 유형을 결정하기 때문에 이러한 문제를 겪지 않습니다.

결과 유형

명확하게 결과의 유형.?:연산자는 어떤 의미에서 두 번째 및 세 번째 피연산자 유형의 통일이어야 합니다.C에서 이것은 숫자 유형에 대해 산술적 승격에 의해 달성됩니다. C에는 포인터 유형대한 유형 계층이 없기 때문에 포인터 피연산자는 동일한 유형(유형 한정자 무시)이거나 하나가 void 또는 NULL인 경우에만 사용될 수 있습니다.포인터와 일체형 또는 호환되지 않는 포인터 유형을 혼합하는 것은 정의되지 않은 동작입니다.

번호 = 철자를 외우다 ? "두 번째" : 42; 

대부분의 컴파일러에서 컴파일 시간 오류가 발생합니다.

문체 지침서로.

조건 연산자는 널리 사용되며 특정 상황에서 사용을 피하기 위해 유용할 수 있습니다.if추가 동사가 너무 길거나 구문 컨텍스트에서 문을 허용하지 않기 때문입니다.예:

#정의 MAX(a, b) (((a)>(b) ? (a) : (b))

또는

 위해서 (i = 0; i < MAX_패턴; i++)     c_c_continue[i].창 표시(m_data.fOn[i] ? SW_SHOW : SW_HIDE); 

(이 예제에서는 Microsoft Foundation Classes Framework for Win32를 사용합니다.)

초기화

조건 연산자의 중요한 사용은 여러 초기화 문이 아니라 단일 초기화 문을 허용하는 데 있습니다.대부분의 경우 단일 할당과 식별자상수가 될 수 있습니다.

가장 간단한 이점은 Python에서와 같이 변수 이름의 중복을 방지하는 것입니다.

x = 'fo' 한다면 b 또 다른 '바' 

다음 대신:

한다면 b:     x = 'fo' 또 다른:     x = '바' 

더 중요한 것은 C++와 같이 블록 범위가 있는 언어에서는 if/else 문의 블록이 새 범위를 생성하므로 변수는 if/else 문 앞에 선언해야 합니다.

표준의:: s; 한다면 (b)     s = "foo"; 또 다른     s = "바"; 

조건 연산자를 사용하면 이 작업이 단순해집니다.

표준의:: s = b ? "foo" : "바"; 

게다가, 초기화는 이제 별도의 문이 아닌 선언의 일부이기 때문에, 식별자는 (형식적으로) 상수가 될 수 있습니다.

컨스 표준의:: s = b ? "foo" : "바"; 

대소문자 선택기

적절하게 포맷된 경우, 조건 연산자를 사용하여 간단하고 일관성 있는 대소문자 선택기를 작성할 수 있습니다.예:

차량 = 아그 == 'B' ? 버스 :           아그 == 'A' ? 비행기를 :           아그 == 'T' ? 기차 :           아그 == 'C' ?  :           아그 == 'H' ? 말. :                        피트; 

변수 할당 컨텍스트에서 조건부 연산자를 적절하게 사용하면 할당된 변수가 여러 번이 아닌 한 번만 명시되기 때문에 잘못된 할당으로 인한 버그의 가능성이 줄어듭니다.

조건 연산자가 없는 프로그래밍 언어

다음은 조건 연산자를 제공하지 않는 주목할 만한 범용 프로그래밍 언어의 예입니다.

참고 항목

레퍼런스

  1. ^ Strachey, Christopher (2000). "Fundamental Concepts in Programming Languages". Higher-Order and Symbolic Computation. 13: 11–49. doi:10.1023/A:1010000313106. S2CID 14124601.
  2. ^ "5.5 Conditional expressions". The BCPL Reference Manual (PDF). 1967. pp. 16–17. Archived from the original (PDF) on 2016-03-16. Retrieved 2017-03-15.
  3. ^ Wastl, Eric. "Ternary operator associativity". phpsadness.com. PHP Sadness. Retrieved 20 September 2017.
  4. ^ "Rationale for Ada 2012". ACAA. Retrieved 10 December 2015.
  5. ^ a b ISO.IEC 9899:1999 (E) 6.5.15.4
  6. ^ "C++ Operator Precedence". en.cppreference.com. section: "Notes".
  7. ^ a b "Does Go have the ?: operator?". The Go Programming Language FAQ. Retrieved 2012-08-05.
  8. ^ 자바 7 규격 : 15.25 조건부 연산자 ? :
  9. ^ "Control Flow · The Julia Language". docs.julialang.org. Retrieved 2020-03-12.
  10. ^ "ECMA-262 Edition 5.1". Ecma Language Specification. Ecma International. Retrieved 7 September 2013.
  11. ^ "Kotlin Lang If Expression". kotlinlang.org. Retrieved 2021-04-25.
  12. ^ "Syntax § If-then-else expressions". Luau. Retrieved 2023-02-07.
  13. ^ Christiansen, Tom; Wall, Larry; Foy, Brian D (February 2012). "Chapter 2 Unary and Binary Operators: Conditional Operator". Programming Perl (Fourth ed.). Sebastopol, CA: O'Reilly Media. p. 123. ISBN 978-0-596-00492-7.
  14. ^ Wall, Larry. "perlop: Conditional Operator". Perl Programming Documentation. Retrieved 26 January 2019.
  15. ^ Eevee (2012-04-09). "PHP: a fractal of bad design". Retrieved 2015-10-04.
  16. ^ "Comparison Operators, Example #3: Non-obvious Ternary Behaviour". PHP website. Retrieved 2013-04-26.
  17. ^ "PHP Bug #61915: incorrect associativity of ternary operator". PHP website. 2012-05-02. Retrieved 2013-04-26. We can't fix this without breaking code
  18. ^ "The Python Language Reference".
  19. ^ Wall, Larry. "Perl6 Operators". Archived from the original on 2009-03-29. Retrieved 2010-05-18.
  20. ^ 프로그래밍 루비: 조건부 실행
  21. ^ "Remove Ternary Operator by pwoolcoc · Pull Request #1705 · rust-lang/Rust". GitHub.
  22. ^ "Remove ternary operator · Issue #1698 · rust-lang/Rust". GitHub.
  23. ^ "If expressions". The Rust Reference. Retrieved 2015-07-21.
  24. ^ "Ternary operator in PowerShell". Stack Overflow. Retrieved 2018-10-09.

외부 링크