선택 구조에서 조건 식의 평가 결과는 참이거나 거짓이다. 참과 거짓의 두 가지의 값만을 가질 수 있는 데이터 타입을 부울 데이터(Boolean data)라 한다. C 언어는 수치 값을 비교하여 부울 값을 생성하는 관계 연산자와 부울 값을 결합하는 논리 연산자를 제공한다. 이러한 연산자들은 조건 식을 표현하는데 적합하게 사용된다. 여기서는 C 언어가 제공하는 두 가지 유형의 연산자, 관계 연산자와 논리 연산자에 대해서 알아본다.


1. 관계 연산자

관계 연산자는 두 개의 값을 비교하는데 사용된다. C 언어는 다음과 같이 6개의 관계 연산자를 제공한다.

       관계연산자

     의미

 

>

      크다
 

<

      작다
 

>=

      크거나 같다
 

<=

      작거나 같다
 

==

      같다
 

!=

      같지 않다

관계 연산자는 두 개의 값을 비교하므로, 두 개의 피연산자를 갖는 이항 연산자이다. 피연산자에는 상수와 변수 모두 올 수 있다. 다음은 관계 연산자를 사용하여 표현된 올바른 조건 식(이를 관계 식이라 한다)이다.

    n < 20
    age >= 18
    24 > 5
    limit <= 100
    flag == done
    m != 0

위의 관계 식의 평가 결과는 모두 부울 값이다. 가령, 첫 번째 관계 식에서 n이 5를 포함하고 있으면, 그 관계 식의 결과 값은 참이다. 세 번째 관계 식은 피연산자가 모두 상수이므로, 그 결과 값은 항상 참이다. 마지막번째 관계 식에서 m이 0을 포함하지 않으면 참이다.

다음은 올바르지 않은 관계 식의 예이다.

 

관계 연산자

설명

 

n =< m

       연산자가 잘못 표기되었다
             (=, <의 순서가 바뀌었다)
 

n < = m

       연산자가 잘못 표기되었다
             (중간에 공백이 허용되지 않는다)
 

5 >> 7

       잘못 표현된 연산자
 

n =! 5

       잘못 표현된 연산자
             (n = (!5)로 인식)

 

[문장 단위 입력 실행] 다음 실습창에서 관계식을 한문장씩 입력하여 실행시켜  볼 수 있다.

 

 관계 식에 산술 식이 포함될 수 있다. 다음은 그 예이다.

    a > b + c

관계 연산자와 산술 연산자 중에서 어느 것이 평가 평가되는가? 위의 식은 다음과 동일하다.

    a > (b + c)

즉, 산술 연산자는 관계 연산자보다 평가 우선순위가 더 높다. 위의 관계 식은 다음과 같은 순서로 평가된다.

 



다음은 산술 식을 포함하는 관계 식의 예이다.

    a + b >= c + d

a - 1 < b - 2 * c

n%2 == 0

위의 세 번쩨 관계 식은 n이 정수 변수일 경우, n의 값이 짝수인지를 판단하는 조건을 표현하는 것임을 알 수 있다. 정수 값을 2로 나누어서 그 나머지 값이 0이면 짝수이다.

다음은 위의 두 번째 관계 식이 평가되는 과정을 보여준다.

 


[문장 단위 입력 실행] 다음 실습 창을 통해서 산술 식이 포함된 관계 식을 실습한다.

식의 평가 결과 알아보기

 


관계 연산자는 수치 값 외에도 문자 데이터도 비교할 수 있다. 문자들간의 비교의 기준은 ASCII 코드 값에 따른다.
가령, 'A'의 ASCII 코드 값이 'B'의 ASCII 코드 값보다 수치적으로 작고, 'B'는 'C'의 경우보다 ASCII 코드 값이 수치적으로 작다. 따라서 다음의 관계 식 값은 참이다.

 

 

'A' < 'C'


다음은 위의 관계 식의 해석 과정을 보여준다. 먼저, 관계 식에 포함된 각 문자를 ASCII 코드 값으로 변환하고, 이 코드 값을 비교한다.

 

다음은 문자 데이터를 포함한 관계 식의 예이다.

 

 

'B' <= 'D'
'E' == 'e'
'a' < 'P'
'F' != 'G'

여러분은 위의 관계 식에 포함된 ASCII 코드 값을 확인하여 식을 평가할 수 있겠다.

[문장 단위 입력 실행] 다음 실습 창을 통해서 문자를 포함한 관계 식을 실습한다.

식의 평가 결과 알아보기



2. 논리 연산자

논리 연산자는 피연산자로서 부울 값을 취하고, 이들을 결합하여 다른 부울 값을 생성한다. C 언어는 다음 3 개의 논리 연산자를 제공한다.

 

논리 연산자

의미

 

!

            논리적 NOT
 

&&

             논리적 AND
 

||

             논리적 OR

논리 연산자의 의미를 진리표(truth table)을 사용하여 확인할 수 있다. 진리표는 각 가능한 논리 값들의 조합에 대해서 논리 연산자의 평가 결과를 보여준다.

다음 진리표는 피연산자가 p, q일 때 && 논리 연산자에 대한 진리표를 보여준다. 여기서 참과 거짓을 각각 true와 false로 표현한다.

 

p

q

p&&q

 
true
true
true
 

true

false
false
 

false

true
false
 

false

false
false

위의 진리표로부터 && 논리 연산자는 두 피연산자의 부울 값이 모두 true인 경우에만 논리 식을 true로 평가하고, 그 외에는 false로 평가한다는 것을 알 수 있다.

 

 

다음은 || 연산자에 대한 진리표인다.

 

p

q

p||q

 
true
true
true
 

true

false
true
 

false

true
true
 

false

false
false

위의 진리표로부터 || 논리 연산자는 두 피연산자의 부울 값이 모두 false인 경우에만 논리 식을 false로 평가하고, 그 외에는 true로 평가한다는 것을 알 수 있다.

 

 

 

다음은 !연산자에 대한 진리표이다.

 

p

!p

 
true
false
 

false

true

! 연산자는 다른 논리 연산자와는 달리 단항 연산자이며, 주어진 피연산자의 부울 값을 단지 반대로 한다. 즉, p의 값이 true이면 논리 식은 false로 평가되고, p의 값이 false이면 논리 식은 true로 평가된다.

 

다음은 논리 식의 사용 예이다.

 

 

height >= 120 && weight > 30

위의 논리 식은 관계 식을 포함하고 있다. C 언어에서 논리 연산자는 관계 연산자보다 평가 우선순위가 높다. 따라서 위의 논리 식은 다음 식과 동일하다.

 

 

(height >= 120) && (weight > 30)

위의 논리 식에서 관계 식은 각각 부울 값을 생성하고, 논리 연산자 &&이 생성된 두 부울 값을 결합한다.

 

다음은 약간 더 복잡한 논리 식의 예이다. 이 논리 식은 산술 연산자, 관계 연산자, 논리 연산자를 포함한다.

 

 

a + b / 2 > 10 || n > 10

평가 우선순위가 산술 연산자, 관계 연산자, 논리 연산자 순으로 높으므로 위의 식은 다음과 같이 평가된다.

 

 

다음은 약간 더 복잡해진 논리 식의 예이다. 이 논리 식은 산술, 관계 연산자뿐만 아니라 논리 연산자를 한 개 이상 포함하고 있다.

 

 

height >= 120 && weight > 30 || a + b / 2 > 10

위의 식은 &&와 ||의 논리 연산자를 모두 포함하고 있다. 어느 논리 연산자를 먼저 평가할 것인가? C 언어에서 &&이 ||보다 평가 우선순위가 높다. 따라서 위 식의 평가는 다음과 같이 이루어진다.

 

 

위의 논리 식을 약간 더 복잡하게 한 다음 논리 식은 어떻게 평가될 것인가?

 

 

height >= 120 && weight > 30 || a + b / 2 > 10 && !flag

! 논리 연산자는 단항 연산자이고, 따라서 다른 이항 연산자보다 가장 먼저 평가된다. 따라서 위의 식은 다음과 같이 평가된다.

[문장 단위 입력 실행] 다음 실습 창을 통해, 논리 식, 관계 식, 산술 식이 혼합된 식을 평가한다.

식의 평가 결과 알아보기

 




3. 연산자 우선순위

지금까지 여러분은 산술, 관계, 논리 등 많은 연산자를 다루었다. 연산자간의 우선순위를 알고서 원하는 식을 올바르게 작성하는 것이 중요하다. 다음은 지금까지 배운 연산자들간의 우선순위를 정리하여 보여준다.

 
                                             <테이블 4-1: 연산자 우선순위>

위의 표에서 보듯이, ()가 우선순위가 가장 높다. 따라서 연산자간의 우선순위가 명확하지 않을 경우에 괄호를 사용하여 확실하게 연산자 우선순위를 표현하는 것이 좋다. 또한, 프로그램의 이해도를 높이기 위해서 괄호를 사용하는 것이 바람직하다.

관계 연산자에서 동등(==)과 비동등(!=)이 다른 관계 연산자보다 우선순위가 높은 것을 알 수 있다.

결합법칙은 동일 연산자나 같은 수준의 연산자가 여러 개 포함된 경우에 연산자가 적용되는 순서를 결정한다.
왼쪽에서 오른쪽의 결합법칙은 왼쪽에 위치한 연산자가 먼저 적용되고, 오른쪽에서 왼쪽의 결합 법칙은 오른쪽에 위치한 연산자가 먼저 적용된다는 것을 나타낸다. 단항 연산자와 배정 연산자만이 오른쪽에서 왼쪽의 결합법칙이 적용되고, 그 외의 연산자는 왼쪽에서 오른쪽의 결합법칙이 적용된다는 것을 알 수 있다.

산술 연산자에 대한 결합 법칙에 관해서는 2주차 강의 4.4절에서 다루었다. 여기서는 배정 연산자의 결합 법칙에 대해서 살펴본다.

다음 코드를 생각해보자.

 

 

int a, b, c;
....
a = b = c = 10;

위 문장은 올바른가? C에서 배정을 나타내는 기호 '='이 연산자로서 다루어지기 때문에 올바르다. 그렇다면, 위 문장의 실행 효과는 무엇인가?

배정 연산자는 결합법칙이 오른쪽에서 왼쪽의 순서로 적용되므로, 다음의 문장과 동일하다.

 

 

a = (b = (c = 10));

따라서 c의 변수에 10이 배정되고, 다음에 c에 포함된 값이 변수 b에 배정되고, 다음에 b에 포함된 값이 변수 a에 배정된다.

 

 

따라서 위의 배정문의 실행효과는 다음 3개의 문장을 실행하는 것과 동일하다.

 

 

a = 10;
b = 10;
c = 10;



top으로... 다음페이지로.. 이전페이지로.. home으로..

top으로... 다음페이지로.. 이전페이지로.. home으로..

top으로... 다음페이지로.. 이전페이지로.. home으로..

top으로... 다음페이지로.. 이전페이지로.. home으로..

 

top으로... 다음페이지로.. 이전페이지로.. home으로..