C언어 물음표 연산자 - ceon-eo mul-eumpyo yeonsanja

조건 연산자: 피연산자가 세개인 '삼 항 연산자'


이 조건 연산자는 피연산자의 수가 세개이기 때문에 삼 항 연산자로도 불린다. 조건 연산자는 if~else문을 일부 대체 할 수 있습니다.

조건 연산자의 구성은 아래처럼 이루어져 있다.

조건 ? TRUE : FALSE;

조건 연산자는 기호 '?' 와 기호 ':' 으로 이루어져 있으며, 두개의 기호가 서로 떨어져 하나의 연산자를 구성하기 때문에 피연산자를 3개 까지 둘 수 있는 것입니다.

위의 조건연산자의 구성을 바탕으로 하여 다시 작성 한다면 아래의 예처럼 쓸 수 있습니다.

num1>num2 ? num1 : num2;

위의 문장에서 조건이 '참(TRUE)' 이면 연산결과로 num1이 반환 되고, 조건이 '거짓(FALSE)'라면 연산결과로 num2가 반환된다.

또한 이 조건 연산자는 대입 연산자보다 우선 순위가 높기 때문에 아래와 같이 활용 할 수 있다.

int data = num1>num2 ? num1 : num2;

위의 문장을 풀어쓴다면 num1이 num2보다 크기가 크다면 num1이 반환되어 data로 대입되고 반대로 num2가 크다면 num2가 반환되어 data로 대입됩니다.

이해를 돕자면 아래와 같은 형태가 됩니다.

위 조건이 참일 경우

int data = num1;

위 조건이 거짓일 경우

int data = num2;

완전한 이해를 돕기 위해 아래의 간단한 예제로 확인을 해보는 것이 좋습니다.

C언어 물음표 연산자 - ceon-eo mul-eumpyo yeonsanja

결과

위의 예제 처럼 반환해야 할 값에 변수뿐만이 아니라 연산식도 올 수 있습니다. 때문에 num*(-1)이 abs에 대입 될 수  있는 것 입니다. 이 경우에는 연산식의 계산 결과가 반환이 됩니다.

또한 아래의 예제 처럼 다양하게 활용 할 수도 있습니다.

결과

위 예제처럼 printf함수를 반환 하는것도 가능합니다.

조건 연산자라는 것이 처음에 는 어색 하지만 간단한 if~else를 대체 할 수 있는 매우 간편한 연산자입니다.

if~else를 대체 하여 소스코드를 간결하게 만들 수 있으니 잘 숙지 하도록 합니다.

도움이 되셨다면 아래의 공감 버튼 한번 눌러 주시기 바랍니다.

대부분의 조건연산자는 if, else if, else 문으로 분기하여 사용한다.

그러나 잘 쓰지 않지만 (잘 보기 힘들지만) 한줄짜리로 똑같은 역할을 하는 조건연산자를 만들 수 있다.

이를 보통 "삼 항 연산자" 항이 3개인 연산자 라고 하여.. 불린다.

사용법은 간단하다.

그저 한줄에 =>     ( 조건 ) ? ( a  ) : ( b  ); 이러한 형식으로 입력하면 된다.

그리고 조건이 참이면 왼쪽값 a가 반환되고, 거짓인 경우 오른쪽 b가 반환된다.

#include <stdio.h>


int main(void)
{
    int a = 2;
    int b = 3;

    int result = 0;

    // 조건이 맞냐?  참이면 왼쪽 반환, 거짓이면 오른쪽 반환
    result = (a>b) ? (a) : (b);

    printf("%d\n", result);

    return 0;
}

반응형

C언어 물음표 연산자 - ceon-eo mul-eumpyo yeonsanja

개발자에 따라 다양한 이름으로 불리기도 하는데 사용법이 간단해서 if문을 사용하기 번거로운 경우에 자주 사용하곤 합니다.  

그러다 보니 많은 언어에서 사용 되고 있는데 조건이 복잡해지면 그냥 if문을 사용하는게 좋을 때도 있는데 if문을 사용할 수 없는 상황에서는 직관적이지 않은 경우도 발생 합니다.

C언어 물음표 연산자 - ceon-eo mul-eumpyo yeonsanja

기본적인 삼항 연산자 표현은 다음과 같습니다.

조건식이 참이면 반환값1을 조건식이 거짓이면 반환값2를 넘겨주는 단순한 연산자 입니다.

예제를 하나 만들어 보는게 제일 이해하기 쉽죠.

varnAA=1;
varnBB=2;
 
varnZZ= (nAA>nBB) ?10:20;
 
console.log(nZZ);
console.log((nAA>nBB) ?10: 20);
결과 20

그러나 조금 더 복잡하게 삼항 연산자가 중복되게 작업을 해야 하는 경우도 있습니다. 

varnAA=1;
varnBB=2;
varnCC=3;
 
var nFF= (nAA!=nBB) ?nCC<5?6:7:4;
 
console.log(nFF);
console.log((nAA !=nBB) ?nCC<5?6:7:4);
결과 : 6

예제는 간단하게 표시했지만 실제 사용할때는 조건과 반환값이 길어져서 눈동자를 왔다갔다 하게 만드는데 이런 경우에는 보기가 쉽지 않으니 괄호를 이용해 조금 단순하게 표시해 주면 이해하기 편합니다.

var nFF = (nAA != nBB) ? (nCC < 5 ? 6 : 7) : 4;

이렇게 하면 첫번째 예문과 동일한 구조이고 내부에 하나가 추가된것을 확인할 수 있습니다.

추가된 조건문이 복잡해지는 경우에도

varnAA=1;
varnBB=2;
varnCC=3;
 
var nFF= (nAA!=nBB) ?nCC<5&&nBB==3?6:7 :4;
 
console.log(nFF);
console.log((nAA!=nBB) ?nCC<5 &&nBB==3?6:7:4);
결과 : 7

var nFF = (nAA != nBB) ? ((nCC < 5 && nBB == 3) ? 6 : 7) : 4;

이렇게 괄호를 이용하면 좀더 쉽게 구조를 파악할 수 있습니다.

만일 조건이 좀더 많아진다면 

varnAA=1;
varnBB=2;
varnCC=3;
varnDD =4;
varnEE=5;
 
varnGG=nAA==nBB?11: nAA==nCC?22:nAA==nDD?33:44;
 
console.log(nGG);
console.log(nAA ==nBB?11:nAA==nCC?22:nAA==nDD?33: 44);
결과 : 44

이런 경우는 if 조건문 처럼 줄바꿈을 해주면 보기가 편해집니다. 

varnAA=1;
varnBB=2;
varnCC=3;
varnDD =4;
varnEE=5;
 
varnGG=nAA==nBB?11
        :nAA==nCC?22
        :nAA==nDD?33
        : 44;
 
console.log(nGG);
console.log(nAA==nBB?11
        : nAA==nCC?22
        :nAA==nDD?33
        :44);
결과 : 44

이렇게 하고 보면

if(nAA == nBB) return 11

else if(nAA == nCC) return 22

좀더 친숙한 if ~ else 문과 비슷하게 인식하고 사용할 수 있습니다.

nexacro 작업하다 grid 표현식 때문에 사용할 때마다 기억이 가물거려 정리를 해봅니다.

숫자 대신 text, edit, combo등을 사용하면 되겠죠?

- copy coding -