본문 바로가기
카테고리 없음

C와 Python의 삼항연산자 순서는 어떻게 다른가?

by 일코 2022. 1. 21.
두 개의 정수를 입력 받아서 두 수의 차를 출력하는 프로그램을 구현해 보자. 단, 무조건 큰 수에서 작은 수를 뺀 결과를 출력해야 한다. 예를 들어서 입력된 두 수가 순서에 상관없이 12와 5라면 7이 출력되어야 하고, 입력된 두 수가 순서에 상관없이 4와 16이라면 12가 출력되어야 한다. 즉, 출력 결과는 무조건 0 이상이 되어야 한다.

- 윤성우 열혈C프로그래밍 p.189, 문제 08-1 [if~else문의 활용] 중 문제 2

C의 삼항연산자는

참고로 필자는 C 입문자 수준으로, C나 C++의 고급문법에 대해 무지한 상태이다. 참고바람..

위의 예제는 C의 삼항 연산자(Three Operand)를 활용해볼 수 있는 간단한 문제이다.

if~else 문을 일부 대체할 수 있는 조건 연산자인 삼항 연산자는 피연산자의 수가 세 개이기 때문에 "삼항 연산자"로도 불린다. 이러한 조건 연산자는 다음과 같이 구성이 된다.

 

(num1>num2) ? (num1) : (num2);  // 소괄호는 생략 가능하다.

 

즉, 조건 연산자는 기호 ? 와 기호 : 으로 이뤄진다. 이렇듯 두 개의 기호가 서로 떨어져서 하나의 연산자를 구성하기 떄문에 피연산자를 3개까지 둘 수 있는 것이다. 위의 조건 연산자 문장을 다음과 같이 다시 쓸 수 있다.

(조건) ? data1 : data2

 

위의 문장에서 조건이 '참'이면 연산결과로 data1이 반환되고, 조건이 '거짓'이면 연산결과로 data2가 반환된다. 따라서 다음과 같은 형태로 조건 연산자를 구성할 수 있다.

int num3 = (num1>num2) ? (num1) : (num2);

 

이 경우, 대입 연산자보다 조건 연산자의 우선순위가 높으므로 조건 연산자가 먼저 진행된다. 따라서 num1 > num2가 '참'이라면 연산의 결과로 num1이 반환되어 (조건 연산문 전부를 num1이 대체한다고 생각하면 된다), 다음의 형태가 된다.

int num3 = num1;

 

반대로 num1 > num2 가 '거짓'이라면 연산의 결과로 num2가 반환되어 다음의 형태가 된다.

int num3 = num2;

 

이를 토대로 상단 <보기>의 문제를 풀어보면,

#include "stdio.h"

int main(void) {
    int num1 = 0, num2 = 0;
    printf("정수 2개 입력: ");
    scanf("%d %d", &num1, &num2);
    printf("두 수의 차는: %d\n", num1 > num2 ? num1 - num2 : num2 - num1);
    return 0;
}

 

조건연산자의 결과를 변수에 넣지 않고, 자체를 printf의 파라미터로 넣어도 실행이 된다.

 

파이썬의 삼항연산자는

파이썬에도 if-else문이 들어있는 리스트컴프리헨션이나 삼항연산자의 경우

C의 삼항연산자와 비슷하게 동작하지만, 순서가 아래와 같이 C와 다르다.

(파이썬에 익숙해서 그런지 모르겠지만) 비전공자인 내 기준에는 아래의 파이썬 코드가 훨씬 직관적으로 느껴진다.

>>> # 정수 a를 절댓값으로 바꾸는 파이썬 삼항연산자
>>> a = -5
>>> a = a if a>0 else -a
>>> print(a)
5
>>> # 정수리스트 a를 모두 양수로 바꾸는 리스트컴프리헨션
>>> a = [-1, 2, -3, 4, -5]
>>> a = [i if i>0 else -i for i in a]
>>> print(a)
[1, 2, 3, 4, 5]
필자도 물론 abs함수를 알고 있다..

 

어떤가? 파이썬은 간단한 영어문장을 읽듯

의미가 직관적으로 이해되는 컨벤션이 많아서 참 편하다는 느낌이다.

 

파이썬과 다른 언어를 비교하면서 공부하는 중에도,

파이썬의 단점보다는 장점을 더 많이 발견하게 되는 것 같다.

틈틈이 다른 언어를 배우면서 느끼는 점도 포스팅해두려고 한다.

 

댓글