자료형·형변환·연산자
자료형을 먼저 확인한 다음 연산 순서대로 중간값을 기록한다.
실기 학습 목표
자료형을 먼저 확인한 다음 연산 순서대로 중간값을 기록한다.
핵심 이론
C·Java의 정수끼리 나누기는 소수 부분을 0 방향으로 버린다. Python의 /는 실수 나눗셈, //는 바닥 나눗셈이다. 음수에서 -7/3의 정수 결과와 -7//3을 혼동하지 않는다.
형변환은 수행 시점이 중요하다. (double)(5/2)는 2.0이고 (double)5/2는 2.5이다. 문자 코드는 문제의 문자 집합 조건을 확인한다.
비트 AND(&)는 공통 1, OR(|)는 어느 한쪽의 1, XOR(^)는 서로 다른 비트를 남긴다. 마스크로 설정은 x|m, 제거는 x&~m, 반전은 x^m이다.
논리 &&·||는 단락 평가로 오른쪽 연산을 생략할 수 있다. ++가 있는 식은 전위·후위와 실행 여부를 함께 추적한다. C에서 순서가 정해지지 않은 여러 변경이나 signed overflow의 출력을 단정하지 않는다.
시프트는 자료형·비트 폭·부호를 확인한다. Java의 >>는 부호를 채우고 >>>는 0을 채운다. 출력은 값뿐 아니라 공백·구분자·줄바꿈까지 기록한다.
계산 전에 자료형을 쓰는 이유
연산 결과는 숫자뿐 아니라 피연산자의 자료형에 의해 결정된다. C·Java에서 7/2를 먼저 계산하면 정수 3이므로, 나중에 실수형 변수에 넣어도 3.0이다. 7/2.0은 나누는 순간부터 실수 연산이어서 3.5가 된다. 형변환 괄호가 어느 값에 붙는지 먼저 표시한다.
비트 연산은 자릿수를 맞추면 손으로도 확인할 수 있다. 6 & 3은 110 & 011 = 010이므로 2, 6 ^ 3은 101이므로 5다. 논리 연산의 참·거짓과 정수의 비트열을 같은 것으로 취급하지 않는다. x & 1은 최하위 비트를 읽어 홀짝을 판별하는 대표적인 사용이다.
손으로 추적하는 순서
- 변수 선언 옆에 정수·실수·문자·문자열을 적는다.
- 괄호 안부터 계산하고, 한 식의 결과와 변수 변경을 구별한다.
y=x++는 증가 전 값을 y에 넣고 x를 증가시킨다. &&의 왼쪽이 거짓이거나||의 왼쪽이 참이면 오른쪽을 실행하지 않는다. 그 안의 증가식도 건너뛴다.- 마지막에 출력 서식을 적용한다. 숫자 값이 같아도
%02d가 만든03과3은 출력 문자열이 다르다.
예를 들어 x가 0일 때 x != 0 && 10/x > 2에서는 나눗셈을 실행하지 않는다. 이것이 단락 평가가 오류를 피하는 원리다. 계산 도중 예상 답에 맞춰 변수를 수정하지 말고, 실행된 식만 상태표에 반영한다.
풀이 예시
다음 C17 프로그램이 표준 출력에 기록하는 내용을 쓰시오. 마지막 줄바꿈의 유무는 답안에서 구별하지 않는다.
#include <stdio.h>
int main(void) {
int total = 31, count = 5;
double a = total / count;
double b = (double)total / count;
printf("%.2f %.2f\n", b - a, (a + b) / 2);
return 0;
}
예시 정답
0.20 6.10
풀이 과정
a는 정수 나눗셈 31/5의 결과인 6이 실수로 변환되어 6.0이다. b는 나눗셈 전에 피연산자가 실수로 바뀌어 6.2이다. 차이는 0.2, 두 값의 평균은 6.1이다.
답안 점검
위 풀이 예시의 답을 가린 뒤, 핵심 이론의 규칙을 적용해 직접 풀어 보세요. 코드와 계산 문제는 중간값·단위·최종 출력의 순서를, 용어 문제는 지문의 핵심 단서와 답의 의미를 점검하세요. 해설과 다른 부분이 있으면 어느 조건을 놓쳤는지 확인하고 연결된 실기 문제로 다시 연습하세요.