기본 콘텐츠로 건너뛰기

방송대 방통대 C프로그래밍 4강 - 입출력 함수와 연산자(2) - 요약 노트 시험족보 예상문제 - 올에이클래스

C프로그래밍 4강 - 입출력 함수와 연산자(2)

C프로그래밍 4강 - 입출력 함수와 연산자(2)

C 언어의 산술·관계·논리·조건·대입·비트 연산자를 학습하고 각 연산이 값을 만드는 과정을 살펴본다. 이어서 sizeof, 콤마, 형변환 연산자의 기능과 묵시적 형변환, 연산자 우선순위와 결합방향을 정리한다.

1. 연산자의 개념과 분류

연산자(operator)는 자료를 대상으로 각종 연산을 수행하도록 지시하는 기호이다. 연산의 대상이 되는 값을 피연산자라고 하며, 연산자의 종류에 따라 필요한 피연산자의 수와 만들어지는 결과가 달라진다.

구분연산자주요 기능
산술+ - * / % ++ --사칙연산, 나머지, 증가와 감소
관계> < >= <= == !=두 값의 대소와 같음 비교
논리&& || !불 값의 논리곱·논리합·부정
대입= += -= *= /= %= <<= >>= &= |= ^=우측 값을 좌측 저장공간에 저장
조건?:조건에 따라 두 값 중 하나 선택
비트& | ^ ~ << >>정수 값의 비트 단위 연산
기타sizeof, 콤마, &, *, 형변환크기·주소·포인터·자료형 변환 등

같은 기호라도 문맥에 따라 역할이 달라질 수 있다. 예를 들어 &는 두 정수 사이에서는 비트 AND이고, 하나의 피연산자 앞에서는 주소를 구하는 연산자이다.

2. 산술 연산자

이항 산술 연산자

+, -, *, /는 두 피연산자를 사용하는 사칙연산자이고, %는 나눗셈의 나머지를 구한다. 연산 결과가 자료형의 범위를 벗어나 오버플로가 발생하지 않도록 해야 하며 나눗셈의 제수는 0이 아니어야 한다.

실수형 나눗셈 3.0 / 2.0의 결과는 1.5이지만 정수형 나눗셈 3 / 2의 결과는 1이다. 정수끼리 나눈 결과도 정수형이므로 소수점 이하 부분을 버린다.

나머지 연산자 %는 정수형에만 사용할 수 있다. 나머지는 피제수 - (피제수 / 제수) × 제수로 정의된다. 따라서 5 % 3은 2, -5 % 3은 -2, 5 % -3은 2, -5 % -3은 -2이다.

printf의 출력양식 안에서 백분율 기호 자체를 출력하려면 %%를 사용한다. 예를 들어 printf("x %% y = %d", x % y);처럼 작성한다.

단항 부호와 증감 연산자

단항 -+는 값의 부호를 표현한다. ++는 값을 1 증가시키고 --는 1 감소시킨다. 전치형은 값을 먼저 바꾼 뒤 변화된 값을 연산식의 값으로 사용하고, 후치형은 변화 전 값을 연산식의 값으로 사용한 뒤 변수 값을 바꾼다.

수식(a=10)연산 후 ab에 저장되는 값
b = ++a;1111
b = a++;1110
b = --a;99
b = a--;910

3. 관계 연산자와 논리 연산자

불 값과 관계 연산자

불 값(boolean value)은 참과 거짓을 나타낸다. C에서 거짓은 0이고, 참은 1 또는 0이 아닌 값으로 표현한다. 관계 연산자와 논리 연산자는 조건을 평가하여 이러한 불 값을 만든다.

관계 연산자 ==는 같음, !=는 다름을 검사하고 >, >=, <, <=는 대소 관계를 비교한다. a가 4일 때 a > 2a == 4는 1, a < 2는 0이다.

논리 연산자와 단락 평가

연산자기능참이 되는 조건
&&논리곱 AND두 피연산자가 모두 참
||논리합 OR두 피연산자 중 하나 이상이 참
!부정 NOT피연산자가 거짓

논리 연산 중 결과가 확정되면 나머지 부분은 실행하지 않는다. 이를 이해하면 변수 값의 변화를 정확히 추적할 수 있다. 예를 들어 a > 0 && b++ <= 5 && --c > 0에서 a=4, b=7이면 첫 조건은 참이고 두 번째 조건을 평가하면서 b는 8이 된다. 두 번째 조건이 거짓이므로 세 번째 조건은 실행되지 않아 c는 그대로 10이다.

&&는 앞부분이 거짓이면 뒤를 평가하지 않고, ||는 앞부분이 참이면 뒤를 평가하지 않는다. 이를 논리식의 단락 평가로 이해해야 한다.

4. 조건 연산자

조건 연산자 ?:는 주어진 조건이 참일 때와 거짓일 때의 값 중 하나를 선택한다. 세 개의 피연산자를 사용하는 형식은 다음과 같다.

조건식 ? 조건이 참일 때의 값 : 조건이 거짓일 때의 값

두 정수 a와 b 중 최댓값은 a >= b ? a : b로 구할 수 있다. a가 b보다 크거나 같으면 a를, 그렇지 않으면 b를 선택한다. 조건 연산식 전체도 선택된 값을 갖는 하나의 식이다.

조건 연산자는 참·거짓에 따라 수행할 문장 블록을 고르는 제어문이 아니라 두 값 중 하나를 결과로 만드는 연산자이다.

5. 대입 연산자

l-value와 r-value

대입 연산자 =는 우측 피연산자의 값을 좌측 피연산자에 저장한다. 좌측은 값을 저장할 수 있는 공간인 l-value, 우측은 저장할 값인 r-value이다. 대입 연산식 자체의 값은 저장된 값이다.

대입은 오른쪽에서 왼쪽으로 결합한다. c = b = a;에서는 먼저 a의 값이 b에 저장되고, 그 대입식의 값이 다시 c에 저장된다. a가 float형 1.5이고 b가 int형이면 b에는 1이 저장되며, 그다음 c에는 1이 저장되어 1.000000으로 표현된다.

복합 대입 연산자

expr1 op= expr2expr1 = expr1 op expr2와 같은 의미를 간결하게 나타낸다. op 자리에는 + - * / % << >> & ^ | 등을 사용할 수 있다.

int a = 10, b = 3, c = 1;
a *= b - 1;  /* a = a * (b - 1), 결과 20 */
b /= 2 + 3;  /* b = b / (2 + 3), 결과 0 */
c += 2;      /* c = c + 2, 결과 3 */

복합 대입의 우측 식은 하나의 피연산자로 평가된다. 따라서 a *= b - 1a = a * (b - 1)로 이해해야 한다.

6. 비트 연산자와 비트 마스크

비트 단위 연산

비트 연산자는 문자형을 포함한 정수형 값의 각 비트를 대상으로 연산한다. 실수형에는 적용하지 않는다.

연산자기능
a & b대응 비트가 모두 1일 때 1
a | b대응 비트 중 하나라도 1이면 1
a ^ b대응 비트가 서로 다를 때 1
~a모든 비트의 0과 1을 반전
a << n각 비트를 왼쪽으로 n비트 이동
a >> n각 비트를 오른쪽으로 n비트 이동

비트 마스크의 활용

마스크와 AND 연산을 하면 마스크의 0인 위치를 0으로 지울 수 있다. OR 연산을 하면 마스크의 1인 위치를 1로 채우며, XOR 연산을 하면 마스크의 1인 위치만 반전한다.

목적연산마스크 효과
특정 비트를 0으로 지우기x & maskmask가 0인 자리 제거
특정 비트를 1로 채우기x | maskmask가 1인 자리 설정
특정 비트를 반전하기x ^ maskmask가 1인 자리만 0↔1 전환

비트 이동과 2의 거듭제곱

왼쪽으로 n비트 이동하면 2n을 곱하는 효과가 있다. 40 << 3은 40×8인 320에 해당하지만 오버플로를 주의해야 한다. 오른쪽으로 n비트 이동하면 2n으로 나누는 효과가 있어 40 >> 2는 40÷4인 10이다. 음수의 오른쪽 이동에서는 부호비트가 유지되는 점에 유의한다.

7. sizeof와 콤마 연산자

sizeof 연산자

sizeof(expr)는 자료형이나 식이 차지하는 기억공간의 크기를 바이트 단위로 구한다. expr에는 자료형, 상수, 변수, 연산식 등을 사용할 수 있다.

강의의 환경에서 int형 변수 a에 대해 sizeof(a)sizeof(a + 5)는 4이고, double형 상수인 10.0에 대한 sizeof(10.0)은 8이다.

콤마 연산자

콤마 연산자는 두 개 이상의 식을 하나의 식으로 묶고 왼쪽부터 차례로 평가한다. 콤마 연산식 전체의 값은 마지막 식의 값이다. 하나의 식만 넣을 수 있는 곳에서 여러 식을 처리할 때 사용한다.

for (i = 0, j = 4; i < 5; i++, j--)
    printf("[%d, %d]\n", i, j);

초기식과 증감식에 각각 두 식을 묶었기 때문에 [0, 4]부터 [4, 0]까지 출력할 수 있다.

8. 명시적·묵시적 형변환

명시적 형변환

형변환(type cast)은 식의 자료형을 다른 자료형으로 바꾸는 것이다. (typename)expr 형식의 형변환 연산자를 사용하면 expr의 값을 지정한 자료형으로 명시적으로 변환한다.

int형 a=3, b=4일 때 c = a / b;를 계산하면 정수형 나눗셈이 먼저 수행되어 0이 되고, 그 뒤 double형 c에 0.000000으로 저장된다. c = (double)a / b;처럼 a를 double로 바꾸면 실수형 나눗셈이 이루어져 0.750000이 된다.

묵시적 형변환

형변환 연산자를 쓰지 않아도 연산 가능한 자료형으로 자동 변환되는 것을 묵시적 형변환이라고 한다. char, unsigned char, short, unsigned short처럼 int보다 작은 정수형은 효율적인 처리를 위해 int 또는 unsigned int로 승격된다.

서로 다른 자료형이 섞인 식에서는 표현 범위가 더 큰 자료형으로 변환하며 연산 순서에 따라 필요한 지점에서 변환한다. doubleVar + intVar * floatVar에서는 먼저 intVar가 float로 변환되어 곱셈하고, 그 결과가 double로 변환되어 doubleVar와 더해진다.

결과를 double 변수에 저장한다고 해서 앞선 정수 나눗셈이 실수 나눗셈으로 바뀌지는 않는다. 나눗셈을 수행하기 전에 피연산자 하나를 실수형으로 변환해야 한다.

9. 연산자 우선순위와 결합방향

하나의 식에 여러 연산자가 있으면 우선순위가 높은 연산자를 먼저 수행한다. 우선순위가 같으면 결합방향에 따라 묶인다.

우선순위연산자 부류결합방향
높음괄호·배열·구조체 () [] -> .좌→우
단항 ! ~ ++ -- & * sizeof, 형변환우→좌
승·제 * / %, 가·감 + -좌→우
비트 이동, 대소 비교, 등가 판정좌→우
비트 AND → XOR → OR좌→우
논리 AND → 논리 OR좌→우
조건 연산자 ?:우→좌
낮음대입 연산자 = += -= *=우→좌

곱셈과 나눗셈은 덧셈과 뺄셈보다 먼저 수행하고, 관계 연산은 논리 연산보다 먼저 수행한다. 조건 연산자와 대입 연산자는 오른쪽에서 왼쪽으로 결합한다. 복잡한 식은 의도를 분명히 하기 위해 괄호로 연산 순서를 표시하는 것이 좋다.

핵심 개념 정리

  • 연산자는 자료를 대상으로 연산을 지시하는 기호이며 필요한 피연산자 수와 결과가 다르다.
  • 정수 나눗셈은 소수점 이하를 버리고 나머지 연산자는 정수형에만 사용할 수 있다.
  • 전치 증감은 변화된 값을, 후치 증감은 변화 전 값을 연산식의 값으로 사용한다.
  • C에서 0은 거짓이고 0이 아닌 값은 참이며 논리식은 결과가 확정되면 나머지를 평가하지 않는다.
  • 조건 연산자는 조건에 따라 두 값 중 하나를 선택하고 대입 연산자는 우측 값을 좌측 저장공간에 저장한다.
  • AND·OR·XOR 비트 마스크로 특정 비트를 지우고, 채우고, 반전할 수 있다.
  • sizeof는 기억공간 크기, 콤마 연산식은 마지막 식의 값을 결과로 갖는다.
  • 명시적 형변환은 원하는 자료형을 직접 지정하고 묵시적 형변환은 연산에 맞춰 자동으로 일어난다.
  • 여러 연산자가 섞인 식은 우선순위와 결합방향에 따라 평가한다.

최종 정리: 연산식을 정확히 해석하려면 연산자의 기능뿐 아니라 피연산자의 자료형, 전치·후치 여부, 단락 평가, 우선순위와 결합방향을 함께 살펴야 한다. 복잡한 계산은 중간 값과 자료형 변환 시점을 순서대로 추적해야 한다.

예상문제 20선

1. 연산자에 대한 설명으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
연산자는 피연산자인 자료를 대상으로 각종 연산을 지시하는 기호이다.

2. 정수식 3 / 2의 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
정수형 나눗셈의 결과도 정수형이므로 소수점 이하를 버린 1이 된다.

3. 나머지 연산자 %를 사용할 수 있는 자료형은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
나머지 연산자는 정수형 피연산자에만 사용할 수 있다.

4. a가 10일 때 b = a++; 실행 후 a와 b의 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
후치 증가식의 값은 증가 전 값 10이고, 연산 뒤 a 자체는 11이 된다.

5. C 언어에서 거짓을 나타내는 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
C에서는 0을 거짓, 1 또는 0이 아닌 값을 참으로 취급한다.

6. 두 값이 같은지를 검사하는 관계 연산자는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
==는 같음을 비교하고 =는 값을 저장하는 대입 연산자이다.

7. 논리 AND 연산에서 앞 피연산자가 거짓이면 어떻게 되는가?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
AND는 하나라도 거짓이면 전체가 거짓이므로 앞부분에서 확정되면 나머지를 실행하지 않는다.

8. a와 b 중 큰 값을 선택하는 조건 연산식은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
a가 b보다 크거나 같으면 a를, 아니면 b를 선택하므로 최댓값이 된다.

9. 대입 연산자의 좌측 피연산자가 갖추어야 할 성질은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
대입 연산자는 우측 값을 좌측 저장공간에 기록하므로 좌측은 l-value여야 한다.

10. a += 5와 같은 의미의 식은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
복합 대입은 좌측 값에 연산 결과를 다시 저장하므로 a += 5a = a + 5이다.

11. 대응하는 두 비트가 서로 다를 때 결과 비트가 1인 연산자는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
XOR 연산자 ^는 두 비트가 다를 때만 1을 만든다.

12. 특정 비트만 1로 채울 때 사용하는 마스크 연산은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
OR는 어느 한쪽 비트라도 1이면 1이므로 마스크의 1인 위치를 설정한다.

13. 오버플로가 없을 때 40 << 3의 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
왼쪽 3비트 이동은 2의 3제곱인 8을 곱하는 효과이므로 40×8=320이다.

14. sizeof 연산자가 구하는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
sizeof는 자료형 또는 식의 결과가 차지하는 메모리 크기를 바이트 단위로 구한다.

15. 콤마 연산식 전체의 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
콤마 연산자는 여러 식을 차례로 평가하고 마지막 식의 값을 전체 결과로 삼는다.

16. a=3, b=4가 int형일 때 double c = a / b;의 c 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
정수 나눗셈 3/4가 먼저 0이 된 뒤 double형으로 저장되므로 결과는 0.0이다.

17. a=3, b=4일 때 실수 나눗셈 결과 0.75를 얻는 식은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
나눗셈 전에 a를 double형으로 바꾸면 b도 연산에 맞게 변환되어 실수 나눗셈을 한다.

18. int보다 작은 정수형이 int 또는 unsigned int로 자동 변환되는 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
char와 short 등의 작은 정수형이 효율적인 연산을 위해 int 계열로 바뀌는 것을 정수형 승격이라 한다.

19. 다음 중 우선순위가 가장 높은 연산자 부류는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
(), [], ->, .는 표에 제시된 연산자 중 가장 높은 우선순위를 갖는다.

20. 오른쪽에서 왼쪽으로 결합하는 연산자는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
대입 연산자와 조건 연산자는 오른쪽에서 왼쪽으로 결합하며, 산술·관계 연산자는 왼쪽에서 오른쪽으로 결합한다.

댓글