[깨알 C언어 5~13 영상]
[문] 아래 C 프로그램의 실행 결과는?
#include <stdio.h>
void main(){
int a, b;
a = 4 * (1 / 2); // 1/2 = 0 (정수 나눗셈) → a = 4 * 0 = 0
b = a++; // 후위 증가: b = a(0) 저장 후 a는 1로 증가
printf("%d", b); // b 출력 → 0
// 최종 결과: 0
}
① 0 ② 1 ③ 2 ④ 3
→ ① 0
※ 산술 연산자 종류
| 구분 | 종류 | 예 |
| 이항 연산자 | +, -, *, /, % | 3 * 4; |
| 단항 연산자 | ++, -- | 4++; |
| 대입 연산자 | =, +=, -=, *=, /=, %= | a += 3; |
[문] 아래 C 프로그램의 출력은?
#include <stdio.h>
int main(){
int a = 5, b = 5;
a *= 3 + b++;
printf("%d %d", a, b);
return 0;
}
// 과정 → 결과
int a = 5, b = 5;
a *= 3 + b++;
// b++ → 현재 값 5 사용 후 b는 6으로 증가
// 3 + 5 = 8
// a *= 8 → a = 5 * 8 = 40
printf("%d %d", a, b);
// a = 40, b = 6 출력
// 최종 결과: 40 6
// 정답: ②
① 40 5
② 40 6
③ 45 5
④ 45 6
→ ② 40 6
※ 산술연산자 종류
| 구분 | 종류 | 예 |
| 높음 | () | 괄호 |
| ↑ | ++, --, ~, ! | 단항 |
| | | *, /, % | 산술 |
| | | +, - | 산술 |
| | | <<, >> | 비트 |
| | | <, <=, >, >= | 비교 |
| | | ==, != | 관계 |
| | | &, ^, | | 비트 |
| ↓ | &&, || | 논리 |
| 낮음 | =, +=, -=, *=, /=, %= | 대입 |
※ 연산자 우선순위 예시
int a = 3;
int b = 4;
int c = 5;
int d = 6;
① a * b + c >= d && d / a - b != 0
→ 결과 : 둘 다 참이므로, 1
② d % b + ++a * c-- =
→ 결과 a 1값 증가 → d % b 결괏값 2 → a*c-- 결괏값 20(계산 후 c -1) → 2 + 20 → 22
[문] 아래 C 프로그램의 출력은?
#include <stdio.h>
int main()
{
int i = 3;
int j = 4;
if ((++i > j--) && (i++ < --j)) i = i-- + ++j;
else j = i-- - --j;
printf("%d\n", i);
}
// 과정 → 결과
int i = 3;
int j = 4;
// if ((++i > j--) && (i++ < --j))
// 1단계: ++i > j--
// ++i → i = 4
// j-- → 비교 후 j 감소 (현재 비교 시 j=4)
// 4 > 4 → false(0)
// j는 이후 3이 됨
// && 연산은 앞이 false이면 뒤 조건 평가 안함 (short-circuit)
// 따라서 (i++ < --j)는 실행되지 않음
// 현재 상태: i = 4, j = 3
// else 실행
// j = i-- - --j
// i-- → 먼저 4 사용 후 i=3
// --j → 먼저 j=2 감소 후 사용
// j = 4 - 2 = 2
// 최종 i 값은 3
printf("%d\n", i);
// 출력: 3
→ 3
※ 논리연산자 종류
| 연산자 | 예 | 결과값 |
| ! | !9 | 0 |
| && | 3 >= 3 && 3 > 3 | 0 |
| || | 5 > 5 || 5 >= 5 | 1 |
※ 조건문
• 단순 if 문
if(조건){
조건이 만족할때의 처리;
}
• if ~ else 문
if(조건){
조건이 만족할때의 처리;
}
else{
조건이 아닐때의 처리
}
• 다중 if 문
if(조건1){
조건1이 만족할때의 처리;
}
else if(조건2){
조건2가 만족할때의 처리
}
else{
모든 조건이 아닐때의 처리
}
[문] 아래 C 프로그램의 실행결과는?
#include <stdio.h>
int main(){
int a = 3+5, b = 1, c;
int ap, bp;
ap = a++;
bp = ++b;
b = 3 * (ap == 8);
c = 5 * (ap != 8);
printf("%d %d %d %d %d", a, b, c, ap, bp);
}
// 과정 → 결과
int a = 3+5, b = 1, c; // a=8, b=1
int ap, bp;
ap = a++; // ap=8 저장 후 a=9
bp = ++b; // b=2 증가 후 bp=2
b = 3 * (ap == 8); // ap=8 → (참=1) → b=3*1=3
c = 5 * (ap != 8); // ap=8 → (거짓=0) → c=5*0=0
printf("%d %d %d %d %d", a, b, c, ap, bp);
// a=9, b=3, c=0, ap=8, bp=2
// 최종 결과: 9 3 0 8 2
→ 93082
※ 관계연산자 종류
| 연산자 | 예 | 결과값 |
| == | 10 == 9 | 0 |
| != | 3 != 3 | 0 |
| > | 5 > 5 | 0 |
| >= | 5 >= 5 | 1 |
| < | 7 < 7 | 0 |
| <= | 7 <= 7 | 1 |
[문] 다음과 같은 C 언어 문장에서 모든 변수가 int형이라고 가정할 때,
문장을 실행한 결과 각 변수들의 값은 얼마인가?
y = 3 + 2 * (x = 7 / 2);
① x=3, y=3
② x=3, y=9
③ x=3, y=10
④ x=3.5, y=10
→ ② x=3, y=9
[문] 다음 C 프로그램의 실행 결과는?
#include <stdio.h>
void main(){
double d_value;
float f_value = 5.65;
int n;
d_value = f_value;
d_value = d_value + 0.5;
n = (int)d_value;
printf("%3.1f, %d", d_value, n);
}
// 실행 과정 → 결과
float f_value = 5.65; // f_value = 5.65
double d_value;
int n;
d_value = f_value; // d_value = 5.65
d_value = d_value + 0.5; // 5.65 + 0.5 = 6.15
n = (int)d_value;
// 형변환(int)
// 소수점 버림 → n = 6
printf("%3.1f, %d", d_value, n);
// %3.1f → 소수 첫째 자리까지 출력
// 6.15 → 반올림 → 6.2 출력
// 최종 결과: 6.2, 6
// 정답: ④
① 6.1, 5
② 6.1, 6
③ 6.2, 5
④ 6.2, 6
→ ④ 6.2, 6
※ 출력 변환기호
| 기호 | 의미 | 데이터 타입 |
| %d | 부호 있는 10진수 출력 | 정수, 문자 |
| %f | 고정 소수점으로 출력 | 정수, 실수 |
| %c | 문자 출력(문자 하나) | 문자 |
| %s | 문자열 출력 | 문자열 포인터 |
| %x | 16진수 출력 | 정수 |
| %o | 8진수 출력 | 정수 |
① printf("값1 : %d, 값2 : %d", 10, 5);
값1 : 10, 값2 : 5
② printf("값 : %c", 65);
값 : A
③ printf("값 : %c", 'A');
값 : A
④ printf("값 : %s", "안녕하세요.");
값 : 안녕하세요.
⑤ printf("값 : %x", 34);
값 : 22
⑥ printf("값 : %o", 34);
값 : 42
※ 정수형 자리수 지정
① printf("값 : %d", 13);
값 : 13
② printf("값 : %5d", 13); // 5개의 빈칸을 만들고 뒤부터 채움
값 : 13
③ printf("값 : %05d", 13); // 5개의 빈칸을 만들고 빈 곳에 0값 입력
값 : 00013
※ 실수형 자리수 지정
③ printf("값 : %-6.1f", 3.26);
값 : 3.3
// %-6.1f
// - : 왼쪽 정렬
// 6 : 전체 자리수 6칸 확보
// .1 : 소수점 첫째 자리까지 출력
// 3.26 → 반올림 → 3.3
// 남는 칸은 오른쪽 공백 처리
④ printf("값 : %-6.3f", 3.26);
값 : 3.260
// %-6.3f
// - : 왼쪽 정렬
// 6 : 전체 자리수 6칸 확보
// .3 : 소수점 셋째 자리까지 출력
// 3.26 → 3.260으로 출력
// 남는 칸은 오른쪽 공백 처리
[문] 다음 C 프로그램의 실행 결과는?
#include <stdio.h>
void main(){
int x = 0x11;
int y, z;
y = x & 0x0f;
z = x | 0x0f;
printf("x=%d, y=%d, z=%d", x, y, z);
}
① x=11, y=1, z=31
② x=11, y=31, z=1
③ x=17, y=1, z=31
④ x=17, y=31, z=1
→ ③ x=17, y=1, z=31
// 풀이 과정 → 결과
int x = 0x11;
// 16진수 0x11 = 17(10진수)
// 00010001(2진수)
y = x & 0x0f;
// 0x0f = 15 = 00001111(2진수)
// AND 연산
// 00010001
// 00001111
// --------
// 00000001 → 1
z = x | 0x0f;
// OR 연산
// 00010001
// 00001111
// --------
// 00011111 → 31
printf("x=%d, y=%d, z=%d", x, y, z);
// x = 17
// y = 1
// z = 31
// 최종 결과: x=17, y=1, z=31
// 정답: ③
※ 진법변환
① 10진수 → 2진수
| 19 | C | |
| 2 | 9 | 1 |
| 2 | 4 | 1 |
| 2 | 2 | 0 |
| 2 | 1 | 0 |
19 ÷ 2 = 9 ... 1
9 ÷ 2 = 4 ... 1
4 ÷ 2 = 2 ... 0
2 ÷ 2 = 1 ... 0
1 ÷ 2 = 0 ... 1
아래에서 위로 나머지를 읽음
→ 10011(2)
② 2진수 → 8진수(3자리씩 끊기)
10011(2)
3자리씩 끊기 위해 앞에 0 추가
→ 010 011
각 자리 계산
010 → 0×4 + 1×2 + 0×1 = 2
011 → 0×4 + 1×2 + 1×1 = 3
→ 23(8)
③ 2진수 → 16진수(4자리씩 끊기)
10011(2)
4자리씩 끊기 위해 앞에 0 추가
→ 0001 0011
각 자리 계산
0001 → 0×8 + 0×4 + 0×2 + 1×1 = 1
0011 → 0×8 + 0×4 + 1×2 + 1×1 = 3
→ 13(16)
※ 비트연산자 종류
| 기호 | 의미 | 예 | 예 → 연산 결과 |
| & | 비트 논리곱(AND) → 둘 다 참일 때 참 |
5 & 3 | 0101 & 0011 → 1 |
| | | 비트 논리합(OR) → 둘 중 하나만 참이어도 참 |
5 | 3 | 0101 | 0011 → 0111 → 7 |
| ^ | 비트 배타적 논리합(XOR) → 두 값이 틀려야 참 |
5 ^ 3 | 0101 ^ 0011 → 0110 → 6 |
| ~ | 비트 NOT → 만약, 양수라면 +1후 -붙임 || 음수라면 -1후 +붙임 |
~5 | -6 |
| >> | 비트값을 우측으로 이동 | 5 >> 3 | |
| << | 비트값을 좌측으로 이동 | 5 << 3 |
① 논리곱 (& 연산자)
19 & 13
19 → 10011
13 → 01101
AND 연산
1 & 0 = 0
0 & 1 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
결과
00001(2진수)
→ 1(10진수)
② 논리합 (| 연산자)
19 | 13
19 → 10011
13 → 01101
OR 연산
1 | 0 = 1
0 | 1 = 1
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
결과
11111(2진수)
16 + 8 + 4 + 2 + 1 = 31
→ 31(10진수)
③ 비트 NOT (~ 연산자)
~16 = -17
~-16 = 15
// 비트 NOT(~)
// 각 비트를 반대로 뒤집는 연산
// 공식
// ~n = -(n + 1)
// 계산
// ~16 = -(16 + 1) = -17
// ~-16 = -(-16 + 1)
// = -(-15)
// = 15
[문] C 프로그램의 실행 결과로 옳은 것은?
#define VALUE1 1
#define VALUE2 2
main(){
float i;
int j, k, m;
i = 100 / 300;
j = VALUE1 & VALUE2;
k = VALUE1 | VALUE2;
if(j && k || i) m = i + j;
else m = j + k;
printf("i = %.1f j = %d k = %d m = %03d\n", i, j, k, m);
}
① i = 0.0 j = 0 k = 3 m = 003
② i = 0.3 j = 0 k = 3 m = 000
③ i = 0.0 j = 1 k = 1 m = 001
④ i = 0.3 j = 1 k = 1 m = 001
→ ① i = 0.0 j = 0 k = 3 m = 003
#define VALUE1 1
#define VALUE2 2
main(){
float i;
int j, k, m;
i = 100 / 300; // 정수 / 정수 → 정수 나눗셈 → 0, 이후 float에 저장 → 0.0
j = VALUE1 & VALUE2; // 1 & 2
// 01 & 10 = 00 → j = 0
k = VALUE1 | VALUE2; // 1 | 2
// 01 | 10 = 11 → k = 3
if(j && k || i) // j && k → 0 && 3 = 0
// 0 || i → 0 || 0.0 = 0 → false
m = i + j;
else
m = j + k; // m = 0 + 3 = 3
printf("i = %.1f j = %d k = %d m = %03d\n", i, j, k, m);
// %.1f → 소수 첫째 자리까지 출력 → 0.0
// %03d → 3자리 정수 출력, 빈칸은 0으로 채움 → 003
// 최종 결과: i = 0.0 j = 0 k = 3 m = 003
// 정답: ①
}
※ 매크로란?
• 반복적인 일들을 쉽게 하기 위해 만들어 놓은 것
#define N 10 // 변수 선언
#define SQR(X) X*X // 함수처럼 선언
// 예시.
#define N 10
#define SQR(X) X*X
SQR(N);
SQR(N+2);
100
32
// 실행 과정 → 결과
#define N 10
#define SQR(X) X*X
// 매크로는 함수가 아니라 단순 문자 치환
SQR(N);
// → N*N
// → 10*10
// → 100
SQR(N+2);
// → N+2*N+2 로 그대로 치환
// → 10 + 2*10 + 2
// → 10 + 20 + 2
// → 32
// 이유
// 매크로에 괄호가 없어서 연산자 우선순위가 그대로 적용됨
// * 가 + 보다 먼저 계산됨
// 안전한 작성 방식
// #define SQR(X) ((X)*(X))
// 최종 결과
// SQR(N) → 100
// SQR(N+2) → 32
※ 시프트 연산 >>
10 >> 2
// 10의 2진수
// 10 = 1010(2진수)
10 >> 2
// 오른쪽으로 2칸 이동
// 1010 → 0010
// 결과: 2
// 의미
// 오른쪽 시프트 1번 ≒ 2로 나누기
// 10 >> 2 = 10 / 4 = 2
※시프트 연산 <<
10 << 2
// 10의 2진수
// 10 = 1010(2)
10 << 2
// 왼쪽으로 2칸 이동
// 1010 → 101000
// 결과: 40
// 의미
// 왼쪽 시프트 1번 ≒ 2를 곱하기
// 10 << 2 = 10 * 4 = 40
// 최종 결과
// 10 >> 2 = 2
// 10 << 2 = 40
[문] C 프로그램의 실행 후, 출력 결과 값은?
void main(void){
int a, b;
a = 20;
b = (a > 10) ? a+a : a*a;
printf("b=%d\n", b);
}
① b=20
② b=40
③ b=400
④ b=2020
→ ② b=40
// 실행 과정 → 결과
void main(void){
int a, b;
a = 20;
b = (a > 10) ? a+a : a*a;
// a > 10 → 20 > 10 → true(참)
// 참이므로 a+a 실행
// 20 + 20 = 40
// b = 40
printf("b=%d\n", b);
// 출력: b=40
}
// 최종 결과
// b=40
// 정답: ②
※ 삼항 연산자
- 조건에 따라서 다른 명령을 수행 하는 연산자
- 구조 → 조건 ? 참 : 거짓
int a = 10 > 5 ? 10 : 5;
printf("%d", a);
// 실행 과정
// 10 > 5 → true(참)
// 참이므로 ? 뒤의 10 선택
// a = 10
// 출력 결과
// 10'자격증 공부 > 정보처리기사 실기' 카테고리의 다른 글
| [흥달쌤] 깨알 C언어) IF문, SWITCH문, 반복문, FOR문, WHILE문(do~ while), 다중 FOR문 (0) | 2026.05.28 |
|---|---|
| [흥달쌤] 깨알 C언어) 컴파일러, 인터프리터, 변수(종류와 유효 범위) (0) | 2026.05.03 |
| [흥달쌤] 기출해설특강) 라우팅 영역에 따른 분류(IGP, EGP) (0) | 2026.04.25 |
| [흥달쌤] 기출해설특강) EAI 구축 유형, UI의 설계 원칙, 코드 커버리지, 관계대수 연산자 (0) | 2026.04.25 |
| [흥달쌤] 기출해설특강) IPSec, 리눅스 파일 보안, 시멘틱 웹, REST (0) | 2026.04.25 |