방송대 C프로그래밍 4강: 연산자 우선순위와 형변환
같은 기호를 써도 피연산자의 자료형, 괄호의 위치, 저장 시점에 따라 결과가 달라진다. 이 글은 연산자를 목록으로 외우는 대신, 식의 구조를 복원하고 자료형을 따라가며 부작용까지 확인하는 판정 절차를 만든다. 이 절차를 익히면 산술식, 논리식, 비트 마스크와 형변환 식을 직접 추적하고 위험한 표현도 가려낼 수 있다.
식의 답을 맞히려면 기호보다 네 가지 질문을 먼저 본다
연산자(operator)는 자료를 대상으로 어떤 계산이나 판단을 수행할지 지시하는 기호이고, 그 대상이 피연산자(operand)다. 연산자를 산술, 관계, 논리, 대입, 조건, 비트, 기타 연산자로 분류하는 것은 출발점일 뿐이다. 실제 식에서는 여러 부류가 섞이므로 다음 네 질문을 순서대로 던져야 한다.
- 무엇을 대상으로 하는가? 피연산자가 정수인지 실수인지, 값을 저장할 수 있는 공간인지 확인한다.
- 어떻게 묶이는가? 괄호와 우선순위, 결합방향으로 식의 구조를 복원한다.
- 어떤 자료형으로 계산되는가? 필요한 묵시적 형변환과 명시적 형변환을 계산 시점에 적용한다.
- 값 이외에 무엇이 바뀌는가? 대입, 증가·감소, 단축 평가처럼 변수 상태나 실행 여부가 달라지는지 확인한다.
예를 들어 result = a + b * c > limit && ready;는 왼쪽부터 한 글자씩 계산하지 않는다. 곱셈, 덧셈, 관계 비교, 논리 AND, 대입의 순서로 괄호 구조를 복원하면 다음 뜻이 된다.
result = (((a + (b * c)) > limit) && ready);
이 구조를 먼저 알아야 각 단계의 자료형과 결과를 추적할 수 있다. 괄호는 단순 장식이 아니라 사람이 의도한 묶음을 컴파일러와 독자에게 동시에 보여 주는 표지다.
판정 핵심: 연산자 이름을 외운 뒤 바로 계산하지 말고, 피연산자 확인 - 구조 복원 - 형변환 추적 - 상태 변화 확인의 순서로 읽는다.
피연산자의 자료형이 산술 계산의 규칙을 정한다
+, -, *, /는 덧셈, 뺄셈, 곱셈, 나눗셈을 수행한다. %는 정수 나눗셈의 나머지를 구하며 정수형 피연산자에 사용한다. 같은 /라도 두 피연산자가 정수이면 정수 나눗셈, 하나 이상이 실수형으로 변환되면 실수 나눗셈이 된다.
| 식 | 계산 종류 | 결과 | 판단 근거 |
|---|---|---|---|
17 / 5 | 정수 나눗셈 | 3 | 두 피연산자가 정수이므로 소수 부분을 버린다. |
17 % 5 | 정수 나머지 | 2 | 17 - (17 / 5) * 5 = 2로 검산한다. |
17.0 / 5 | 실수 나눗셈 | 3.4 | 실수 피연산자에 맞추어 계산한다. |
(double)17 / 5 | 명시적 변환 뒤 실수 나눗셈 | 3.4 | 나누기 전에 한 피연산자를 double로 바꾼다. |
직접 구성한 다음 예제는 몫과 나머지를 함께 사용해 17분을 5분 단위 묶음으로 나눈다. 식을 한 번에 보지 말고 각 대입의 오른쪽부터 계산한다.
#include <stdio.h>
int main(void) {
int minutes = 17;
int blocks = minutes / 5;
int remainder = minutes % 5;
printf("blocks=%d, remainder=%d\n", blocks, remainder);
return 0;
}
minutes / 5는 3이고, minutes % 5는 2이므로 출력은 blocks=3, remainder=2다. 검산은 3 * 5 + 2 = 17이다. 나누는 수가 0이면 /와 % 모두 올바른 계산이 되지 않으며, 정수 계산은 표현 범위를 벗어나지 않는지도 별도로 확인해야 한다.
오개념 교정: 결과를 double 변수에 저장한다고 해서 이미 끝난 정수 나눗셈이 실수 나눗셈으로 되돌아가지는 않는다. double ratio = 17 / 5;는 정수 결과 3을 저장해 3.0이 된다. 실수 결과가 필요하면 나눗셈 전에 피연산자를 바꾼다.
증가와 감소는 값의 변화와 식에 보이는 값을 나누어 읽는다
++와 --는 변수의 값을 1만큼 바꾸는 단항 연산자다. 전치형은 먼저 값을 바꾼 뒤 그 값을 식에 제공하고, 후치형은 바뀌기 전 값을 식에 제공한 뒤 변수를 바꾼다. 한 문장에 한 번만 사용하면 차이를 안전하게 추적할 수 있다.
int x = 8;
int before = x++;
int after = ++x;
before = x++;에서 식에 보이는 값은 8이므로before는 8, 그 뒤x는 9가 된다.after = ++x;에서x를 먼저 10으로 바꾸므로after와x가 모두 10이 된다.
그러나 a = ++x * x--;처럼 하나의 완전식에서 같은 변수 x를 여러 번 변경하는 표현은 특정 숫자를 답으로 외우면 안 된다. C에서는 두 변경의 상대적 시점이 안전하게 보장되지 않아 이식 가능한 하나의 결과를 정할 수 없다. 의도가 “증가한 값을 두 번 곱한 뒤 원래 값으로 되돌린다”라면 상태 변화를 문장으로 분리한다.
int x = 5;
x++;
int a = x * x;
x--;
이제 각 문장이 끝날 때마다 상태가 확정된다. 첫 문장 뒤 x는 6, 곱셈 결과 a는 36, 마지막 문장 뒤 x는 5다. 계산 결과는 같아 보일 수 있어도, 이렇게 분리해야 프로그램의 의미가 명확하고 컴파일러나 실행 환경에 기대지 않는다.
안전 규칙: 한 식에서 같은 변수를 여러 번 증가·감소시키지 않는다. 우선순위는 식의 묶음을 정할 뿐, 모든 피연산자의 실행 순서까지 보장하지 않는다.
비교 결과를 논리 연산으로 연결하면 실행 여부까지 달라진다
관계 연산자 ==, !=, >, >=, <, <=는 두 값을 비교해 참이면 1, 거짓이면 0을 만든다. 논리 연산자 &&, ||, !는 0을 거짓, 0이 아닌 값을 참으로 해석해 다시 0 또는 1을 만든다. 따라서 3 && -2는 두 값 모두 0이 아니므로 참이다.
| 목적 | 연산자 | 판정 규칙 | 뒤 식의 실행 |
|---|---|---|---|
| 같음·다름 검사 | ==, != | 두 값의 관계를 0 또는 1로 만든다. | 두 피연산자를 비교한다. |
| 범위 비교 | <, <=, >, >= | 대소 관계를 0 또는 1로 만든다. | 두 피연산자를 비교한다. |
| 모두 참 | && | 앞이 거짓이면 전체가 이미 거짓이다. | 앞이 0이면 뒤를 실행하지 않는다. |
| 하나 이상 참 | || | 앞이 참이면 전체가 이미 참이다. | 앞이 0이 아니면 뒤를 실행하지 않는다. |
| 참·거짓 반전 | ! | 0은 1로, 0이 아닌 값은 0으로 만든다. | 단항 연산이므로 뒤 피연산자가 없다. |
논리 AND와 OR의 단축 평가(short-circuit evaluation)는 결과뿐 아니라 뒤 식의 실행 여부를 바꾼다. 다음 학습용 예에서 count는 증가하지 않는다.
int count = 7;
int valid = (count < 0) && (++count > 0);
첫 비교 count < 0이 거짓이므로 전체 AND가 거짓으로 확정된다. 뒤의 ++count는 실행되지 않아 valid는 0, count는 7이다. “괄호 안에 적혔으니 모두 실행된다”는 생각이 틀리는 이유가 여기에 있다.
조건 연산자 조건 ? 참일 때 값 : 거짓일 때 값은 조건에 따라 두 값 중 하나를 고른다. 예를 들어 int max = a >= b ? a : b;는 두 수 중 큰 값을 선택한다. 두 후보를 모두 실행하는 구조가 아니라 선택된 쪽만 평가한다는 점에서 단축 평가와 연결된다.
대입은 계산 결과가 저장되는 지점과 변환 시점을 정한다
대입 연산자 =는 오른쪽 식의 값을 왼쪽 저장공간에 기록한다. 왼쪽에는 값을 저장할 수 있는 대상인 l-value가 와야 하고, 오른쪽에는 계산된 값인 r-value가 온다. 대입식 전체의 값은 실제로 저장된 값이므로 연쇄 대입도 가능하다.
float source = 2.8f;
int count;
float copy;
copy = count = source;
대입은 오른쪽에서 왼쪽으로 묶인다. 먼저 count = source가 실행되어 2.8이 정수 2로 변환되고, 이 대입식의 값 2가 다시 copy에 저장되어 2.0이 된다. copy가 실수형이라고 해서 처음의 2.8이 보존되는 것이 아니다. 변환이 일어난 위치를 화살표로 추적해야 한다.
복합 대입 op=는 왼쪽 값과 오른쪽 식을 op로 계산한 뒤 왼쪽에 다시 저장한다. 강의 범위의 op에는 +, -, *, /, %, <<, >>, &, ^, |가 있다.
int price = 12;
int factor = 4;
price *= factor - 1;
오른쪽 factor - 1을 먼저 계산하면 3이고, price의 기존 값 12에 곱한 36을 다시 price에 저장한다. 즉 이 문맥에서는 price = price * (factor - 1)로 펼쳐 읽을 수 있다. price * factor - 1로 괄호를 옮기면 47이 되므로 같은 뜻이 아니다.
기호 혼동: =는 저장이고 ==는 같음 비교다. 둘 다 식의 값을 만들 수 있으므로 컴파일만 된다는 사실로 의도를 검증할 수 없다. 조건을 쓰는 자리에서는 “저장하려는가, 비교하려는가”를 먼저 묻는다.
비트 마스크는 바꿀 자리와 보존할 자리를 동시에 표현한다
비트 연산자는 정수형 값의 대응 비트를 한 자리씩 계산한다. &는 두 비트가 모두 1일 때만 1, |는 하나라도 1이면 1, ^는 서로 다를 때 1을 만든다. ~는 각 비트를 반전하며, <<와 >>는 비트를 왼쪽 또는 오른쪽으로 이동한다.
직접 구성한 8비트 학습 예에서 x = 10110011, mask = 00001111이라고 하자. 마스크의 1은 “이 자리에 연산 효과를 적용하라”는 표시로 읽으면 세 연산을 쉽게 구분할 수 있다.
| 목표 | 식 | 결과 | 한 비트 판단법 |
|---|---|---|---|
| 하위 4비트만 남기기 | x & mask | 00000011 | 마스크가 0인 자리는 반드시 0, 1인 자리는 원래 비트를 보존한다. |
| 하위 4비트를 1로 채우기 | x | mask | 10111111 | 마스크가 1인 자리는 반드시 1, 0인 자리는 원래 비트를 보존한다. |
| 하위 4비트만 반전하기 | x ^ mask | 10111100 | 마스크가 1인 자리만 원래 비트와 달라진다. |
왼쪽 이동은 빈 오른쪽 자리를 0으로 채운다. 표현 범위 안의 양수에서 x << n은 2n을 곱하는 효과가 있고, 오른쪽 이동은 양수에서 2n으로 나누는 효과가 있다. 예를 들어 40을 왼쪽으로 3비트 이동하면 40 * 8 = 320, 오른쪽으로 2비트 이동하면 40 / 4 = 10이다.
비트 판정 순서: 정수형인지 확인하고, 비트 폭을 정한 뒤, 마스크의 1이 선택하는 자리를 표시하고, 자리별 연산을 수행한다. 이동 연산은 표현 범위를 벗어나는지와 음수 처리 조건을 별도로 살핀다.
sizeof·콤마·형변환은 식의 범위와 자료형을 조절한다
sizeof는 값이 아니라 저장 크기를 묻는다
sizeof는 자료형이나 식이 차지하는 기억공간의 크기를 바이트 단위로 구한다. sizeof(int), sizeof(variable), sizeof(expression)처럼 사용할 수 있다. 강의 예에서는 int가 4바이트, double이 8바이트인 환경을 보여 주지만, 자료형의 실제 크기는 실행 환경에서 sizeof로 확인하는 습관이 안전하다.
printf("int=%zu, double=%zu\n", sizeof(int), sizeof(double));
sizeof의 결과를 출력할 때는 그 결과형에 맞는 %zu를 사용한다. 화면 출력 폭이나 변수 이름의 길이를 구하는 연산자가 아니라, 프로그램이 다루는 저장 크기를 확인하는 연산자다.
콤마 연산자는 여러 식을 한 식 자리에서 순서대로 평가한다
expr1, expr2는 왼쪽 식을 먼저 평가한 뒤 오른쪽 식을 평가하고, 전체 값으로 마지막 식의 값을 남긴다. 반복문의 초기식이나 증감식처럼 한 자리에 여러 상태 변경이 필요한 경우에 사용할 수 있다.
int i, j;
for (i = 0, j = 6; i < 4; i++, j -= 2) {
printf("[%d, %d]\n", i, j);
}
출력은 [0, 6], [1, 4], [2, 2], [3, 0] 순서다. 초기식에서 두 변수를 설정하고, 각 반복이 끝날 때 i는 1 증가하고 j는 2 감소한다.
형변환은 나중이 아니라 필요한 계산 직전에 적용한다
명시적 형변환은 (typename)expression 형태로 특정 자료형 변환을 지시한다. 묵시적 형변환은 연산 가능한 공통 자료형을 만들기 위해 자동으로 일어난다. char와 short처럼 int보다 작은 정수형은 산술 과정에서 정수형 승격을 거치며, 서로 다른 산술 자료형이 섞이면 필요한 연산 지점에서 더 넓은 표현 범위를 가진 쪽으로 맞춰 계산한다.
int passed = 7;
int total = 8;
double rate = (double)passed / total;
먼저 passed를 7.0으로 바꾸면 나눗셈을 위해 total도 실수형으로 맞춰져 0.875가 계산된다. 반대로 (double)(passed / total)처럼 괄호를 나눗셈 바깥에 두면 정수 나눗셈 0이 먼저 만들어지고, 그 뒤 0.0으로 바뀐다. 형변환의 위치가 계산 종류를 바꾼다.
우선순위와 결합방향은 식의 괄호 구조를 복원한다
우선순위는 서로 다른 우선순위의 연산자가 섞였을 때 무엇이 더 강하게 묶이는지를 정한다. 결합방향은 같은 우선순위의 연산자가 연속할 때 어느 쪽부터 묶을지를 정한다. 둘은 식의 문법적 묶음을 정하지만, 일반적인 피연산자가 실제로 평가되는 시간 순서와 같은 개념은 아니다.
| 높은 쪽에서 낮은 쪽 | 대표 연산자 | 결합방향 | 읽기 단서 |
|---|---|---|---|
| 후위·괄호 계열 | (), [], ->, . | 왼쪽에서 오른쪽 | 호출, 첨자, 구성원 선택을 먼저 묶는다. |
| 단항 | !, ~, ++, --, &, *, sizeof, 형변환 | 오른쪽에서 왼쪽 | 하나의 피연산자에 붙는 작용을 묶는다. |
| 산술 | *, /, % 다음 +, - | 왼쪽에서 오른쪽 | 곱셈 계열이 덧셈 계열보다 먼저 묶인다. |
| 이동·관계·동등 | <<, >>, <, <=, >, >=, ==, != | 왼쪽에서 오른쪽 | 수치 계산 뒤 이동과 비교 구조를 확인한다. |
| 비트 | &, ^, | | 왼쪽에서 오른쪽 | AND, XOR, OR 순으로 우선순위가 낮아진다. |
| 논리 | &&, || | 왼쪽에서 오른쪽 | 비교 결과들을 AND 뒤 OR로 연결한다. |
| 조건·대입 | ?:, =, 복합 대입 | 오른쪽에서 왼쪽 | 선택한 값과 저장 흐름을 오른쪽부터 추적한다. |
예를 들어 int answer = 6 + 3 * 4 >= 18;을 계산하면 3 * 4가 12, 6 + 12가 18, 18 >= 18이 참이므로 answer에 1이 저장된다. 반대로 사람의 의도가 다르면 우선순위 표에 기대지 말고 (6 + 3) * 4처럼 괄호로 표현해야 한다.
서로 다른 세 질문: 우선순위는 “어떻게 묶이는가”, 결합방향은 “같은 층에서 어느 쪽으로 묶이는가”, 단축 평가는 “뒤 식이 실행되는가”를 답한다. 이 세 규칙을 하나로 섞으면 증가·감소나 논리식에서 오답이 생긴다.
새로운 연산식은 여섯 단계로 판정한다
시험 문제나 코드를 만났을 때 다음 순서를 종이에 그대로 적용하면 복잡한 식도 작은 판단으로 나눌 수 있다.
- 변수의 초기값과 자료형을 적는다. 정수와 실수, signed와 unsigned, 저장 가능한 왼쪽 대상을 표시한다.
- 괄호를 가장 먼저 반영한다. 괄호가 없다면 우선순위와 결합방향으로 구조를 다시 쓴다.
- 각 연산 직전의 형변환을 표시한다. 결과를 저장할 때가 아니라 실제 산술이 일어나는 지점을 본다.
- 안쪽 계산부터 값을 구한다. 정수 나눗셈과 나머지는 몫·나머지 관계로 검산한다.
- 실행되지 않는 가지를 지운다.
&&,||,?:가 선택하지 않은 부분의 부작용을 적용하지 않는다. - 대입과 증가·감소 뒤의 상태표를 갱신한다. 하나의 변수에 여러 변경이 겹치는 위험한 식은 문장으로 분리한다.
짧은 자가 점검으로 int a = 3, b = 4, c = 2; int r = a + b * c >= 11;을 판정해 보자. 곱셈 8, 덧셈 11, 관계 비교 11 >= 11의 참 1, 마지막 대입의 순서다. 계산 결과만 맞히는 데서 끝내지 말고 “왜 1인가”를 이 네 단계로 설명할 수 있어야 한다.
마지막 검사: 계산값, 최종 자료형, 변경된 변수, 실행되지 않은 부분을 각각 한 줄로 적는다. 네 항목이 모두 설명되면 연산식의 결과와 상태를 함께 이해한 것이다.
핵심 개념 정리
- 계산 영역: 산술 기호보다 피연산자의 자료형이 정수 계산인지 실수 계산인지 먼저 결정한다.
- 상태 변화: 전치·후치 증가, 대입, 복합 대입은 식의 값과 변수의 최종 상태를 나누어 추적한다.
- 논리 흐름: 관계 연산은 0 또는 1을 만들고, 논리 연산과 조건 연산은 그 결과에 따라 뒤 식이나 선택 가지의 실행을 결정한다.
- 비트 선택: AND는 지우고 남기기, OR는 1로 채우기, XOR는 선택 반전에 적합하며 마스크의 1이 적용 자리를 표시한다.
- 식의 구조: 우선순위와 결합방향으로 괄호 구조를 복원하되, 이를 피연산자의 실행 순서와 혼동하지 않는다.
연산식은 자료형 확인 - 괄호 구조 복원 - 필요한 형변환 - 부분 계산 - 실행 가지 선택 - 상태 갱신의 순서로 읽는다. 이 틀은 다음 차시의 선택 제어문과 반복 제어문에서도 그대로 이어진다. 조건식의 참·거짓과 증가식의 상태 변화를 정확히 추적해야 제어문의 실행 경로를 예측할 수 있다.
예상문제 10선
1. 다음 정수식 17 / 5 * 2 + 17 % 5의 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 정수 몫 3과 나머지 2를 단순히 더해도 5이며, 주어진 곱셈을 반영하지 않은 값이다.
- ② 정답: 같은 우선순위의 나눗셈과 곱셈을 왼쪽부터 계산하면
17 / 5 = 3,3 * 2 = 6이고, 나머지 2를 더해 8이다. - ③ 오답: 몫에 2를 곱한 중간 결과만 적고
17 % 5의 나머지 2를 누락했다. - ④ 오답:
17 / 5를 반올림해 4로 계산한 뒤 진행한 값에 가깝지만 정수 나눗셈은 소수 부분을 버린다.
2. int x = 5; int a = ++x * x--;를 다루는 가장 적절한 방법은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 전치형의 값 규칙만으로 같은 변수에 대한 여러 변경의 상대적 평가 시점을 정할 수 없다.
- ② 오답: 후치형이 원래 값을 제공한다는 사실도 다른 피연산자가 언제 평가되는지를 확정하지 않는다.
- ③ 오답: 우선순위와 결합방향은 문법적 묶음을 정하며 일반 피연산자의 시간 순서를 보장하는 규칙이 아니다.
- ④ 정답: 증가, 곱셈, 감소를 각각 완전한 문장으로 나누면 매 단계의 상태가 확정되어 이식 가능한 코드를 만들 수 있다.
3. 대입 연산자 =와 관계 연산자 ==를 올바르게 구분한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: 대입은 저장 상태를 바꾸고 대입된 값을 남기며, 동등 비교는 저장하지 않고 같음 여부를 0 또는 1로 만든다.
- ② 오답: 두 기호의 기능을 서로 바꾸어 설명했다.
- ③ 오답: 대입의 왼쪽에는 값을 저장할 수 있는 l-value가 필요하며 상수는 저장공간이 아니다.
- ④ 오답: 대입식은 저장된 값을, 비교식은 참·거짓을 나타내는 0 또는 1을 결과로 가진다.
4. 다음 코드 실행 뒤 ok와 count의 값은? int count = 9; int ok = (count < 0) && (++count > 0);
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 첫 비교가 거짓이므로 AND 전체가 참이 될 수 없고 뒤의 증가식도 실행되지 않는다.
- ② 오답: 전체 결과 0은 맞지만 단축 평가를 무시하고
++count를 실행했다. - ③ 정답:
count < 0이 거짓이라 전체 AND는 0으로 확정되고 뒤 식을 건너뛰므로count는 9다. - ④ 오답: 변수 상태는 맞지만 거짓인 첫 피연산자로 인해 논리 AND 결과는 1이 아니라 0이다.
5. 다음 코드의 대입·변환 순서를 올바르게 설명한 것은? float a = 2.8f; int b; float c; c = b = a;
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
- ① 오답: 대입은 오른쪽에서 왼쪽으로 묶이므로
c = a가 먼저 실행되는 구조가 아니다. - ② 정답: 안쪽 대입에서 정수 변환이 먼저 일어나고, 이미 변환되어 저장된 값이 바깥 대입으로 전달된다.
- ③ 오답: 연쇄 대입의 결합방향을 반대로 적용했으며, 초기화되지 않은
b를 읽는 식도 아니다. - ④ 오답: 정수형 저장공간
b에는 실수의 소수 부분을 보존할 수 없어 2로 변환된다.
6. 8비트 값 x=10110011과 mask=00001111에 대해 x & mask의 결과는?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
- ① 정답: AND는 마스크가 0인 상위 네 자리를 0으로 지우고, 마스크가 1인 하위 네 자리에서 원래 비트
0011만 남긴다. - ② 오답: 마스크의 1인 자리를 모두 1로 만드는 OR 결과다.
- ③ 오답: 마스크의 1인 자리만 뒤집는 XOR 결과다.
- ④ 오답: 8비트 범위에서
x의 모든 비트를 반전한 결과이며 마스크 AND가 아니다.
7. 정수 flags의 하위 4비트를 모두 1로 만들면서 상위 비트는 보존하려면 어떤 식이 가장 알맞은가?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: AND는 상위 비트를 0으로 지우고 하위 비트의 기존 값만 남기므로 목표와 다르다.
- ② 오답: XOR는 하위 네 비트를 반전하므로 이미 1인 비트는 0이 될 수 있다.
- ③ 오답: 왼쪽 이동은 모든 비트의 위치를 바꾸며 하위 네 자리 설정만 수행하지 않는다.
- ④ 정답: OR는 마스크가 1인 하위 네 자리를 1로 만들고, 마스크가 0인 상위 자리에서는 원래 값을 보존한다.
8. 콤마 연산식 (expr1, expr2, expr3)에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 콤마 연산자는 뒤의 식들도 순서대로 평가하며 첫 식의 값이 전체 결과가 되지 않는다.
- ② 오답: 여러 식을 하나의 식 자리에서 실행할 뿐, 각 결과에 덧셈을 적용하지 않는다.
- ③ 정답: 콤마 연산의 핵심은 왼쪽부터 평가 순서를 만들고 가장 오른쪽 식의 값을 남기는 것이다.
- ④ 오답: 조건에 따라 한쪽만 선택하는 설명은 조건 연산자나 단축 평가와 혼동한 것이다.
9. int passed = 7, total = 4; double rate = (double)passed / total;에서 rate의 값은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
- ① 오답: 형변환을 나눗셈 뒤에 적용한 정수 몫에 가까운 결과로, 현재 코드는 나누기 전에 변환한다.
- ② 오답: 7을 4로 나눈 값이 아니라 소수 부분을 임의로 줄여 계산했다.
- ③ 정답:
passed가 7.0으로 변환된 뒤 실수 나눗셈을 수행하므로7.0 / 4 = 1.75다. - ④ 오답: 실수 나눗셈도 반올림해 정수로 만드는 것이 아니므로 2.0이 되지 않는다.
10. 다음 코드에서 r의 값은? int a = 3, b = 4, c = 2; int r = a + b * c >= 11;
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
- ① 오답: 산술 결과가 11이고
11 >= 11은 거짓이 아니라 참이다. - ② 오답: 피연산자
c의 값이며 전체 관계식의 결과가 아니다. - ③ 오답: 덧셈까지의 중간값은 11이지만 관계 연산은 이를 다시 참·거짓 값으로 바꾼다.
- ④ 정답: 곱셈 8, 덧셈 11, 관계 비교의 참 1 순서로 계산되어
r에 1이 저장된다.
참고 자료와 작성 기준
이 글은 해당 차시 강의자료를 바탕으로 학습 목적에 맞게 재구성한 비공식 학습자료입니다. 개념 관계, 안전한 코드 예제, 단계별 계산과 문제 해설은 학습자의 이해를 돕도록 구성하고 검토했습니다.
- 작성·편집: 올에이클래스 학습연구팀
- 주요 근거: 한국방송통신대학교 C프로그래밍 4강 「입출력 함수와 연산자(2)」 강의자료
- 보충 자료: 별도의 외부 보충 자료를 사용하지 않음
- 편집 원칙: 올에이클래스 편집 정책
- 최종 내용 검토: 2026-09-06
댓글
댓글 쓰기