티스토리 뷰



이번 문제를 통해서는 C언어 연산자(Operator)의 종류와 연산자별 우선 순위(Precedence)결합 방향(Associativity, 결합성, 연관성)을 다룰까 합니다. 연산 우선 순위는 서로 다른 연산자가 섞여 있는 경우 어떤 연산자를 먼저 수행할 것인지를 다루는 것으로 "a + b * c"인 경우 b*c를 먼저 수행하고 그 결과와 a를 더하는 작업을 나중에 수행하는 것과 같습니다. 결합 방향은 동일한 순위 레벨(+와 -는 같은 수위이고 *과 /도 동일 순위)을 가진 연산자가 섞여 있는 경우 연산 순서를 좌->우로 할지 우->좌로 수행할 지를 결정합니다. 예를 들어 "a + b+ c"는 좌->우 결합성을 가져서 a+b 결과에 c를 더합니다. 그런데 캐스팅, 주소추출등의 연산자는 우->좌 방향으로 연산을 수행합니다.

21. 다음의 코드를 실행하고 난 후 변수 a와 b에 들어가는 값을 순서대로 표시한 것은?
int a, b;
a = (21 / 4) * 3;
b = (a * a) / a;
① 15, 15 ② 16, 15 ③ 16, 16 ④ 15, 16 ⑤ 14, 15

위의 문제를 푸는 과정에서 우선 순위, 결합 방향과 함께 중요한 것은 정수형 연산의 결과와 함께 서로 다른 데이터 타입간의 연산 결과는 어떤 타입을 갖는지 확인하는 것입니다. C언어에서는 서로 다른 타입 간에 연산을 수행하면 값이 큰 쪽으로 자동 형변환을 수행하고 그 연산 결과도 큰 쪽의 데이터형을 갖습니다. 이러한 형태의 자동 형변환을 암묵적 형변환(Implicit Type Conversion)이라 합니다. 모든 연산 우선 순위보다 앞서는 것이 수학처럼 괄호로 묶은 부분인데 문제의 첫 문장에서도 (21/4)를 먼저 수행합니다. 문제는 21과 4가 모두 정수형이므로 결과값도 정수라서 소수점 값은 가질 수 없다는 것에 주의해야 합니다. 결국 5*3=15이고 b = (5 * 5)/5이므로 15입니다. 

만약에 문제의 첫 문장이 "a = (23/4) * 3"이었다고 가정하고 정수형 연산을 잘못 이해하여 소숫점을 감안하여 계산하면 엉뚱한 결과가 나옵니다. 실제로 문제가  "a = (23.0/4) * 3"로 출제되면 괄호안의 연산은 실수로 계산되어 5.75가 되고 *3 연산도 실수 연산으로 수행하므로 결과는 17이 나옵니다. 암묵적 형변환에 사용하는 타입간 크기 비교는 long double > double > float > unsigned long long > long long > unsigned long > long > unsigned > int 의 순입니다.

C언어 연산자의 우선 순위 레벨과 결합 방향 및 설명은 아래와 같습니다.

우선순위 연산자 결합 방향 설명
1 ++, -- 좌->우 후위 증감 연산자
() 함수 호출
[] 배열 지정
., -> 구조체 접근
2 ++, -- 우->좌 전위 증감 연산자
+, - 단항 +, - 연산자
!, ~ 논리 Not 연산자, 비트 Not 연산자
(타입) 명시적 형변환 연산자(Type casting)
*, & 주소 참조, 주소 연산자
sizeof 크기 연산자. sizeof() 방식도 가능
3 *, /, % 좌->우 곱셈, 나눗셈, 나머지(정수만 가능)
4+, -덧셈, 뺄셈
5<<, >>좌우 비트 시프트
6<, >, <=, >=관계 연산자
7==, !=같다, 같지 않다
8&비트 AND
9^비트 XOR
10|비트 OR
11&&논리 AND
12||논리 OR
13? :우->좌삼항연산자
14=대입 연산자, 복합 대입 연산자도 포함
15,좌->우열거 연산자


22. C나 C++ 언어로 작성된 프로그램에서 변수에 저장된 값을 비교할 때 사용하는 연산자가 아닌 것은?
① < ② <= ③ = ④ == ⑤ >=

위의 문제는 관계 연산자와 대입 연산자의 차이를 알고 있다면 거져 점수를 얻을 수 있는 문제입니다. VB의 경우에 = 연산자로 비교도 하고 대입도 하지만 C언어에서는 명확하게 구분하고 하고 있으므로 실제 프로그래밍 과정에서도 오타나 실수가 없도록 주의해야 합니다. == 연산자로 비교할 곳에 = 대입연산자를 사용했다고 문법 오류를 발생시키지 않기 때문입니다.


댓글
댓글쓰기 폼
«   2022/11   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함