C언어에는 삼항 연산자가 있습니다. 어떻게 쓸까요?

 

 

((조건식1)?식1:식2)

 

 

 여기서 조건식 1이 참이라면 식 1이 평가되고, 아니면 식 2가 평가됩니다.

 

 

 흐름도는 대충 이런 식으로 갑니다. 그러면 if문이랑 비슷한 점이 많겠군요. 많은데, 보통 if문 안에는 문장들이 옵니다. 그런 반면에, 삼항 연산자는 식이 옵니다.

 

 

 식이나 값이 온다면, 조건식에 맞으면 값을 어딘가에 대입하는 식으로 많이 쓰시는데요. 예제로 보여드리겠습니다.

 


 예제 1을 봅시다.

 

 

 a와 b를 입력받았습니다. 그리고 6번째 줄을 보시면 (a>b)?a:b 라는 절이 보입니다. 이를 쪼개 봅시다.

 

 

 그러면 a>b인 경우에, a라는 수식이나 값이 평가가 되고, 그렇지 않다면 b가 평가됩니다. 그 결과를 res라는 변수에 넣고 있어요. 즉, a>b인 경우, res가 a가 되고, 아니라면 res가 b가 됩니다. 즉, a와 b를 입력 받고 최댓값을 출력하는 프로그램임일 알 수 있어요. 예제 2를 봅시다.

 

 

 그러면 이 프로그램은 어떤가요?

 

 

 단지 부등호 방향만 바뀌었음을 알 수 있어요. a<b이면 a이고, 아니면 b를 res에 넣는 건데요. a와 b의 최솟값을 출력하는 예제입니다. 이렇게 if, else문을 쓰기에는 조금 길고, 삼항 연산자를 쓰면 간단할 때 쓰는 걸 고려하는 편이에요.

 

 


 조금 더 복잡한 예제를 봅시다. 10부제는 mm월 dd일이고, 내 차량의 자동차 번호가 cc라고 해 봅시다. 이 때, dd의 일의 자리 숫자와 cc의 일의 자리 숫자가 같으면 운행하지 못합니다. 그러면 10부제를 위반하는 차량의 수는 어떻게 구할까요?

 

 일단, 언제 위반하는지부터 조건식을 작성해 봅시다. 차량의 번호를 t, 현재 day일이라고 합시다.

 

 

 그러면 day를 10으로 나눈 나머지와 t를 10으로 나눈 나머지가 같으면 위반을 한 거에요. 그러면 1을 더하고, 아니면 0을 더하게 하고 싶어요. 그러면 일단 요렇게 값을 채워 봅시다.

 

 

 그러면 위반했을 때 1, 아니라면 0이니까, 10부제를 어기면 ans에 1이 증가하게끔 하면 되겠네요.

 

 

 이런 식으로 작성하시면 됩니다. 물론, 그냥 ans = ans + (t%10 == day%10); 이렇게만 작성하셔도 무난합니다. t % 10 == day % 10은 조건이 참일 때 1로 평가되고, 아니면 0으로 평가되기 때문입니다.

 

 


 수도 요금을 계산하는 문제를 생각해 봅시다. C리터 이하를 사용했을 때에는 기본 요금 B원입니다. C리터 이상을 사용했을 때에는 1리터를 넘을 때 마다 D원입니다. 이건 어떻게 해결하면 좋을까요? 일단, x리터를 사용했다고 가정하고, x가 C보다 크거나 같을 때 요금은 B + (x-C)*D일 겁니다. 그런데 x가 C보다 작다면 B = B + 0D 만큼만 내면 됩니다.

 

 

 그러면 초과된 사용분을 평가하려면 x>=C라면 x-C이고, x>=C가 아니라면 0이겠네요. 최종 cost는 초과 사용분에다가 D를 곱한 것에다가 B를 더한 것이고요. 그러면 코드를 이렇게 작성하면 되겠네요.

 

 

 x-C가 0보다 크거나 같다면 x-C가 평가되고, 아니라면 0이 평가되고 있어요. 결국 x>=C라면 초과 사용분이 x-C이고, 아니면 초과 사용분이 0이 될 거고 이 값이 결과값인 res에 반영이 되는 셈입니다. 간단하게 C언어에서 삼항 연산자 예제를 보았습니다.