
다음 내용은 C언어에 출제되는 핵심 내용을 정리해둔 것입니다. 제가 옛날에 시험봤던 C언어 문제들 기반으로 작성되었습니다. 일단 기본적인 개념은 웬만해서 다 아신다고 가정을 하고 문제를 내보겠습니다. 아시는 건 그냥 스킵하셔도 됩니다. 일단 컴프 A+ 받았고 문제도 기억해놓아서 믿으셔도 됩니다. 일단 주제별, 문제로 나올 확률이 높을수록 별 개수를 많이 표기하였습니다. 어차피 컴프 절대 평가니깐 다른 분들하고 많이 공유해주셨음 조켔슴니다.
∨ 기본 개념 문제 ★★★
아마 1번 문제나, 두 번째 장의 첫 번째 문제 정도로 나올 수 있는 개념을 물어보는 문제입니다. 주로 C언어의 문법이나 변수명에 대한 문제가 나올 가능성이 농후하고, 헷갈리는 부분이 있을 수 있으니 짚고 넘어가보도록 합시다.
c언어의 개념 문제의 경우, 프로그램이 무엇인지, C언어 만든사람이 누구인지, 벨 연구소의 업적이 무엇인 지, 순서도 작성법 이런건 나올 일도 없고 나오더라도 어차피 다 틀릴테니 공부 안하셔도 됩니다.
대신 변수명에 대신 규칙을 정리해보겠습니다. 변수명은 문제로 안나올 일이 없기 때문입니다.
변수명 규칙입니다.
- 영문/숫자/언더바(_)만 사용가능
- 대/소문자 구분
- 첫 글자로 숫자는 금지
- 키워드(int, if) 사용 금지
이를 통해 금지되는 변수명을 모두 골라봅시다.
①NUMBER ②number ③2nd ④___ ⑤fisrt-name ⑥ifint ⑦if ⑧x0 ⑨INT, ⑩second name
정답은 ③, ⑤, ⑦, ⑩ 입니다. 일단 이 내용도 의아해 하실 수도 있으니 아래 결과에서 주석 해제하면 오류 발생하시는 거 보실 수 있습니다. 그리고 이딴식으로 문제 안내고 일부로 이상하게 꼬아서 문제 낸거니깐 감안하고 보시면 될 것 같습니다..
우선, ①(NUMBER), ②(number)은 영문으로 작성되어서 문제는 없으나 C언어는 대소문자를 구분하므로 ①번과 ②번 변수는 서로 다른 변수입니다. ③의 "2nd" 경우, 숫자로 시작하면 안된다고 했는데 숫자로 시작해서 문제가 발생합니다. ⑧번의 경우, "x0"에 숫자가 들어있긴 하지만 숫자는 첫 글자에만 안오면 문제없습니다. ④ ___도 이상하긴 한데, 변수는 영문, 숫자, 언더바(_)로 작성하면 문제없기 때문에 언더바도 어떻게 쓰건 문제는 없습니다. ⑤ first-name에서 특수문자 '-'는 허용되지 않습니다. 허용되는 특수문자는 언더바(_)뿐입니다. ⑥ifint도 키워드인 if와 int가 포함되어 있기 때문에 문제가 발생할 것 같으나? ⑦번 if 처럼 아예 키워드와 같지 않으면 괜찮습니다. ⑨번의 INT 변수명의 경우도 대소문자가 달라서 괜찮습니다. int라면 문제가 발생했겠지만요. ⑩의 경우, 변수명이 second name인데 second와 name 사이에 공백이 있어서 문제가 발생합니다. 변수명으로 가능한 것은 영문, 숫자, 언더바(_)이지, 공백은 불가능합니다.
#include <stdio.h>
int main(void) {
int NUMBER;
int number;
//int 2nd;
int ____;
//int fisrt-name;
int ifint;
//int if;
int x0;
int INT;
//int second name;
return 0;
}
∨ printf 출력 문제 ★★★★
보통 첫 장 문제에 printf는 포함되어 있을 겁니다. printf에서 주요 개념들을 봅시다. 이와 관련된 문제를 풀기 위해서는 다음 문자열을 출력할 줄 알아야 합니다.
- 한성대학교
- "한성대학교"
- "\n은 줄바꿈 문자입니다."
- 17 % 3 == 2이다.
위 문자열을 출력하는 printf문을 나열하였습니다. 의심쩍을 수도 있으니 아래 전체 코드를 포함시켜 놓았습니다. 복붙해서 실행해보시길 바랍니다.
printf("한성대학교");
printf("\"한성대학교\"");
printf("\"\\n는 줄바꿈 문자\"");
printf("17 %% 3 == 2이다.");
#include <stdio.h>
int main(void) {
printf("한성대학교");
printf("\n");
printf("\"한성대학교\"");
printf("\n");
printf("\"\\n는 줄바꿈 문자\"");
printf("\n");
printf("17 %% 3 == 2이다.");
return 0;
}
매커니즘은 간단합니다. printf문에서 출력할 문자열은 쌍따옴표 "를 감싸되 이 쌍따옴표 내에서 \"은 "로 출력되고, \\은 \로 출력됩니다. %%은 %로 출력됩니다. 실행시켜 보면서 하시는 것도 좋을 것 같슴다.
#include <stdio.h>
int main(void) {
printf("\\\\"); // -> 쌍따옴표 안의 \\\\는 \\로 출력된다. (\\이 \로 출력되니깐)
printf("\"\""); // -> 쌍따옴표 안의 \"\"는 ""로 출력된다. (\"이 "로 출력되니깐)
return 0;
}
∨ 연산자 ★★★
아마 다양한 연산자와 결과를 예상하는 문제가 나올 것입니다. 이 부분은 크게 다음과 같이 나눌 수 있습니다.
- 사칙연산(나머지 연산 %까지 포함)
- 복합 대입 연산자
- 전위, 후위 연산자 ★★★★★
- 삼항 연산자
- 논리 연산자
∨ 사칙연산(나머지 연산 %까지 포함) ★★
사칙 연산부터 보도록 합시다. 다음 연산의 결과를 예상해봅시다. 일단 사칙연산중에 +, - 이건 볼게 없고 *랑 /, %에서 좀 낚시를 걸 수가 있는데...
17/5
5%17
다음 코드를 실행해보면..
#include <stdio.h>
int main(void) {
int result1 = 17 / 5;
int result2 = 5 % 17;
printf("%d %d", result1, result2);
return 0;
}
다음과 같이 출력됩니다.
3 5
사칙 연산 관련 연산자에서 볼 만한 내용은 2가지 입니다. 정수끼리 나눗셈하면 몫 연산이 수행됩니다. (즉, 나눗셈의 결과가 정수) 즉, 1 / 2 의 결과가 0.5가 아니라는 겁니다. (정수끼리 나눗셈의 결과는 정수이므로),
그리고 두 번째는 나머지 연산자 %를 아느냐. 이정도면 될 것 같습니다.
만약 정수끼리 나눗셈을 할 때 결과가 실수가 되도록 하려면 나눗셈을 수행하는 값 중 하나만 (float) 형변환 연산자 사용해주면 됩니다. ex) (float)17 / 5 -> 결과로 실수가 반환됨.
∨ 복합 대입 연산자 ★★
복합 대입 연산자도 어려운 내용은 아닌데 작년에 교수님께서 강조하시긴 하셔서 일단은 적어봅니다. 아래 코드가 어떻게 작동하시는 지 아시죠? 그냥 우변 값 a + b + c 을 좌변에 곱해주면 됩니다. += 였으면 우변에 좌변을 더해주면 되구요...
z *= a + b + c;
이런건 그냥 이렇게 보면 편합니다. 변수 *= 우변 식을 변수 = 변수 * (우변) 꼴로 바꿔 계산하면 됩니다.
z = z * (a + b + c);
z /= ~~ 이런것도 가능합니다. 끝
∨ 전위, 후위 연산자 ★★★★
다음은 전위, 후위 연산자 내용입니다. 이건 무조건 나온다고 보시면 됩니다. (물론 가지문제로 나올 확률 85%) ++, -- 에 대한 내용인데, 일단 이와 관련한 중요한 내용은 두 개가 있습니다.
- 전위, 후위 연산자는 변수에만 사용가능.
- 증감 타이밍
일단 1번부터 설명하자면 다음의 코드를 보시겠습니다. 추가 설명은 주석으로 달겠습니다.
// num이라는 변수가 존재할 때, 다음처럼 사용가능
num++;
++num;
num--;
--num;
//근데 다음과 같은 경우는 안됨.
5++;
++5;
5--;
--5;
혹시 모르니 이 연산자에 잠깐 짚고 넘어가자면 ++, -- 모두 변수에만 사용가능하고, 위 경우처럼 변수에 붙여주면 ++ 연산자는 변수의 값을 1 증가시켜줍니다. -- 연산자는 변수의 값을 1 감소시켜줍니다. 근데 num++; ++num;처럼 ++ 연산자가 변수 앞에 붙느냐 뒤에 붙느냐에도 아주 중요한 차이가 발생합니다. (물론 두 경우 모두 1 증가시키는 건 똑같습니다.) 이 차이에 관련된 내용이 "2번 증감 타이밍"입니다.
++, -- 연산자가 변수의 앞에 붙느냐 뒤에 붙느냐의 차이는 증감이 언제 이루어지느냐입니다.
++num;
num++;
++num; 처럼 변수의 앞에 ++가 붙으면 num 변수의 값을 1 증가시킵니다. 근데 num++; 처럼 변수의 뒤에 ++가 붙으면 num변수가 포함된 식을 마친 후 증가하게 됩니다. 그냥 말 어려우니깐 다음 예시 보면 됩니다. 코드의 출력을 예상해보세요.
int a = 5;
int b = 4;
int result = a++ + ++b; // 주목!
printf("%d %d %d", a, b, result);
여기서 주목해야 할 부분을 주석으로 표시해두었습니다.
int result = a++ + ++b;
이 식은 정수형 변수 result에 a++ + ++b의 값을 대입하는 식입니다. ++b를 먼저 보면, ++가 변수 앞에 붙었기 때문에 그냥 b의 값을 1 증가시킵니다. 그래서 b의 값은 5가 됩니다. 즉, 다음과 같습니다.
int result = a++ + 5;
근데 여기서 중요한 것은 a++입니다. a++는 a의 값이 ++에 의해 증가하여 6이 될 것 같지만... 변수 뒤에 붙은 ++나 --는 해당 변수가 포함된 코드를 마치고 실행하게 됩니다. 즉, a의 기존 값을 쓰고 증감은 나중에 하는 것이죠. 코드의 흐름은 다음과 같습니다.
int result = 5 + 5; // 일단 a의 값은 5 (증가시키기 이전)
// 이 코드를 실행하여 result 변수에 5 + 5를 대입함!
// 그 후 대입을 마치면 a의 값을 1 증가시킴. (a는 6이 된다.)
따라서 int result = ~~ 코드를 마치고 나서 a의 값을 증가시킵니다. 이 int result = ~~ 코드를 실행할 땐 아직 증가시키지 않는 a의 값을 사용합니다. 아무튼 그래서 결과는 다음가 같습니다.
6 5 10
∨ 삼항 연산자 ★
이 개념도 나오긴 할텐데, 아마 소문제로 딱 하나 출제될 가능성이 높습니다. 아예 안나오진 않을테고, 또 잘 안쓰이는 연산자라 혹시 모르니 보고 갑시다. 삼항 연산자의 형식은 다음과 같습니다.
조건식 ? 값1 : 값2
조건식이 참이면 -> 값1
조건식이 거짓이면 -> 값2
을 반환합니다. 조건식이 참일 때 물음표 바로 뒤 쪽 값을 반환하는 것을 헷갈리지 맙시다.
이 문법은 그냥 예시로만 보고 넘어갑시다. 아마 문제에서도 삼항 연산자의 사용이 아래 2가지 예시에서 크게 벗어나지 않을 것 같습니다. 보고 어떤 코드인지만 이해할 수 있으면 됩니다.
int a = 10;
int b = 8;
int max = (a>b) ? a : b;
int a = 8;
int b = 13;
(a<=b) ? printf("b가 크거나 같음") : printf("a가 큼");
∨ 비교 연산자, 논리 연산자 ★★
별건 아닙니다만 알아두면 좋을 것 같아서 내용을 서술해봅니다. >, == 등의 비교 연산자와 &&, ! 등의 비교 연산자는 결과값으로 1또는 0을 반환합니다. 1은 참(true)를 의미하고 0은 거짓(false)을 의미합니다. 이때 0만 거짓이고, 0이외의 값은 모두 참입니다. 이를 알고 다음 연산 결과를 예상해봅시다.
-1 || 0
!(5 > 3)
!100
!(x=0)
! 연산자는 참을 거짓으로, 거짓을 참으로 바꾸는 연산자인데, 참(0이외의 값)은 0으로, 거짓(0)은 1로 바꿉니다. 그리고 -1은 거짓이 아닙니다... -1은 참이므로 이를 참고하시길 바랍니다. 100 또한 0이외의 값이므로 참입니다. 즉, ! 연산자에 의해 거짓으로 변합니다. 따라서 !100은 0입니다. !(x=0)의 결과를 알기 전에 대입 연산자는 대입한 값을 반환한다는 특징이 있습니다. 변수 x에 0을 대입하므로 (x=0)의 결과값은 0입니다. 여기에 ! 연산자까지 붙이면 !0이고 이는 1입니다.
-1 || 0 // 1
!(5 > 3) // 0
!100 // 0
!(x=0) // 1
약간 불안하신 분은 아래 코드를 실행해서 직접 확인해보시길 바랍니다.
#include <stdio.h>
int main(void) {
int x = 1;
printf("%d %d %d %d", -1 || 0, !(5 > 3), !100, !(x = 0));
return 0;
}
이것도 작년에 소문제로 나왔습니다.
∨ 자료형과 형식 지정자 ★★
입력을 받을 때나 출력할 때 올바른 형식 지정자를 써주어야 합니다. 아니면 반대로 형식 지정자를 보고 어떤 형식으로 출력될 지 예상하는 문제가 나올 겁니다.
우선 정수에 대해 알아보겠습니다. 정수형은 두 가지 특징이 있습니다. 첫째, 부호가 없는 unsigned 자료형은 실수에는 없고 정수형에만 존재한다는 점입니다. (근데 unsigned 자료형 나올 지 모르겟다..) 둘째, 정수 데이터는 10진수뿐만 아니라 8진수와 16진수 형태로도 출력할 수 있습니다. 8-10-16진수 내용은 아래에 따로 빼두겠습니다. 8진수와 16진수 문제는 나올 확률이 높다고 생각합니다. 읽는 방법은 아래 chatgpt 복붙해놓았습니다..
근데 이거 솔직히 작년에 안나오긴 했는데 그래도 코딩할 때 아시긴 하셔야 합니다.
unsigned 자료형 입력/출력 시엔 %u 쓰고, float은 %f, 문자 출력은 %c 등등...
∨ 8, 16진수 ★★★★
일단 이 유형 문제는 나올 확률 높다고 생각합니다. 아마 나오긴 할텐데 이 부분도 어렵진 않아서 괜찮을 겁니다. 다만 10진수, 8진수, 16진수를 어떻게 읽고 서로 어떻게 변환하는 지 모르신다면 아래 부분에서 읽고 오시는 것이 좋을 것 같습니다.
| 10진수, 16진수, 8진수 상수 표기 | ||
| 진법 | 표기 | 예시(다 다른 값) |
| 10진수 | 그냥 우리 일상에서 쓰는 대로 | 12 |
| 16진수 | 앞에 0x를 붙인다. | 0x1A |
| 8진수 | 앞에 0을 붙인다. | 032 |
| 정수 형식 지정자 (10진수, 16진수, 8진수) | ||
| 형식 지정자 | 표기 | 예시(다 다른 값) |
| %d | 10진수 | 9 |
| %x | 16진수 (소문자) | ff |
| %X | 16진수 (대문자) | FF |
| %o | 8진수 | 377 |
| %#x | 0x 포함 16진수 | 0xff |
| %#o | 0 포함 8진수 | 0377 |
아마 10진수를 16진수, 16진수를 10진수로 출력하게 문제가 나올텐데, 16진수나 8진수를 읽을 줄만 안다면 문제 없다고 생각합니다. 그럼 아래 코드의 결과를 예측해보세요.
int a = 0xA5;
int b = 0210;
printf("%d %d",a,b);
결과는 다음과 같습니다.
165 136
8진수나 16진수를 10진수로 바꾸거나 반대로 바꾸는 방법, 또 8진수 읽는 법, 16진수 읽는 법을 바로 아래에 써놓았습니다. 참고하시면 좋을 것 같습니다.
∨ 참고 : 10진수 8진수 16진수
쓸려고 했는데 귀찮기도 하고 솔직히 저 아니어도 다른 글로 충분히 찾아 볼 수 있을 것 같아서 그냥 chatgpt 글 복붙해놓겠습니다.
🔥 진법 변환 (읽기 & 바꾸기)
1️⃣ 10진수 → 2/8/16진수 (나누기 방법)
👉 계속 나누고 나머지를 거꾸로 읽는다
✔ 10진수 → 16진수
예: 165 → 16진수
10 ÷ 16 = 0 ... 10(A)
👉 아래부터 읽기
👉 A5
✔ 10진수 → 8진수
예: 136 → 8진수
17 ÷ 8 = 2 ... 1
2 ÷ 8 = 0 ... 2
👉 아래부터 읽기
👉 210
2️⃣ 2/8/16진수 → 10진수 (곱하기 방법)
👉 각 자리 × (진법의 거듭제곱)
✔ 16진수 → 10진수
예: A5
= 160 + 5
= 165
✔ 8진수 → 10진수
예: 210
= 128 + 8 + 0
= 136
3️⃣ 빠른 팁 (시험용 핵심)
✔ 16진수 문자
- A = 10
- B = 11
- C = 12
- D = 13
- E = 14
- F = 15
✔ 방향 기억법
- 👉 10진수 → 다른 진법
→ 나누기 + 나머지 역순 - 👉 다른 진법 → 10진수
→ 곱하기 + 더하기
🔥 한 줄 정리
👉 나누면 바뀌고, 곱하면 돌아온다
∨ printf문과 형식 지정자 ★★★★
printf문에서 형식 지정자에 따라 어떻게 출력되는 지 볼텐데. 여기 부분에선 자료형 관련 이야기가 아니라 출력 관련 이야기를 할 겁니다. 필드폭과 정렬, 필드입니다.
필드폭은 그냥 %바로 뒤에 숫자를 씀으로써 사용할 수 있습니다. %10d, %3f처럼 말이죠. 출력을 하되, %10d는 10칸을 잡고 정수 출력을, %3f는 3칸을 잡고 실수 출력을 하겠다는 의미입니다. 여기서 10칸을 잡는다는 것은 다음과 같습니다. 만약 다음 코드를 실행한다고 했을 때,
printf("%10d", 12);
10칸을 잡은 후 12를 10칸 내에서 출력합니다. 남은 칸은 공백으로 채우고, 칸이 부족하면 이 10칸을 벗어납니다.

그래서 위 코드 실행해보면 결과가 다음과 같습니다. 앞의 공백이 8칸인지 세보니깐 맞네요 (10칸 중 2칸 차지하고 나머지 8칸은 공백)
12
(아래 bash, 공백 세보았음.)
12
12345678
필드폭 앞에 - 붙여주면 좌측 정렬됩니다.
printf("%-10d%d", 12, 0);
결과가 다음과 같은데 왜냐하면
12 0
다음처럼 10칸 잡고, 좌측 정렬로 12 출력한 후, 0출력하게 되기 때문입니다.

뭐 %010d처럼 %뒤에 필드폭 앞에 0을 써주면 공백 대신 0으로 칸이 채워진다 뭐 그런것도 있는데 그런것까진 문제 안나올 것 같구요..
가장 중요한 형식 지정자는 실수 형태입니다. 일단 float이든 double 형이든 printf문에서 %f 형식 지정자를 이용하구요. 제일 중요한 것은 정밀도입니다. 필드폭은 출력 결과의 전체 자리 수를 의미하며, 정밀도는 소수점 이하 몇 자리까지 출력할지를 의미합니다. 기본적으로 %f는 소수점 이하 6자리까지 출력합니다. 참고로 실수도 필드폭 쓸 수 있습니다.
%3f // 필드폭 사용 예시
정밀도는 만약 소수점 5자리 까지 출력할거면 .5을 형식 지정자 f 앞에 써주면 됩니다.
%.5f
만약 필드폭, 정밀도 둘 다 쓰고 싶으면 다음처럼 하면 됩니다.
%3.5f
이를 바탕으로 1/3 실수를 %10.4f로 출력하면 어떻게 될지 예상해보세요. 일단 10칸 잡고 소수점 4째 자리까지 출력할 것입니다.
#include <stdio.h>
int main(void) {
printf("%10.4f", 1.0/3.0);
return 0;
}
0.3333
여기서 알면 좋은게 그 필드폭에 점(.)도 포함입니다. 근데 물론 이런 것 까진 문제를 내진 않지만 이해 차원에서 설명드렸습니다. 그림으로 표현하면 다음과 같습니다.

실제로 작년에 이와 관련하여 문자형 출력과 연계되어 문제가 출력되었습니다. 다음 결과가 어떻게 될지 예상해보세요..
printf("%2c %2c", 'A', 'a');
결과 :
A a
∨ 아스키 코드★
이 내용은 나오지 않을 것 같긴 합니다만 그래도 문자형 데이터가 어떻게 저장되는 지 물어볼 가능성이 있다고는 생각합니다. 문자형 데이터는 주로 char 자료형에 저장합니다. 하지만 char형은 사실 정수를 저장하는데요. 아스키 표를 기반하여, char형 변수가 문자를 저장할 때 해당 문자에 대응되는 정수값을 대신 저장합니다. 이거면 됐습니다. 다음 예제는 제가 만들어보았는데요. 한 번 결과를 예상해보시길 바랍니다. 아 근데 그 아스키 코드 값 외울 필요는 없습니다. 아스키 코드값을 내는 문제가 나올 확률은 0.002%입니다.
printf("%d %c %c", 'a', 'A', 'A' + 1); // 'd' 아스키 코드값이 100이다.
결과 :
97 A B
∨ switch, break, default ★
switch 문이 문제 나올까 싶지만 그래도 알아야 하는점. break; 쓸때랑 안쓸때랑 차이 있다는 것만 알면 끝. break를 안쓰면 전혀 다른 결과가 나올 수 있음을 알자.
switch (변수) {
case 값1 : 코드1; break;
case 값2 : 코드2; break;
...
default : 코드 n; break;
}
switch (변수) {
case 값1 : 코드1;
case 값2 : 코드2;
...
default : 코드n; // 물론 default에는 break는 있으나 없으나 같다
다음 코드 결과를 예상하시오.
int num = 2;
swtich(num) {
case 1: printf("hello");
case 2: printf("hello");
case 3: printf("hello");
}
∨ 오류 검출 문제 ★★★★
이 내용도 아마 문제에 나올 것 같습니다. 오류가 있는 코드를 주고 고치라는 문제가 나올텐데요. 오류가 발생할만한 부분은 다음과 같습니다.
- 대소문자 ★★★
- 세미콜론 ★★
1번, 대소문자의 경우, C언어는 대/소문자를 구별한다는 것인데요. 우리가 자주 쓰는 printf 함수나 main 함수를 쓸 때도 Printf(), 또는 MAIN() 처럼 쓰면 오류가 나듯 대/소문자를 지켜주어야 합니다. 이는 if나 else, int와 같은 키워드를 쓸 때도 정해진 대/소문자까지 지켜주어야 합니다. 근데 대부분 C언어에서의 함수나 키워드는 대부분 소문자로 되어 있으니 이 부분 참고하시면 될 것 같습니다. 그럼 이를 알고 다음의 코드를 고쳐봅시다.
#Include <stdio.h>
INT main() {
INT X = 100;
printf("%D", X);
Return 0;
}
혹시 몇 군데 찾으셨나요? 주석으로 표현해보겠습니다.
#Include <stdio.h> // #Include -> #include
INT main() { // INT -> int
INT X = 100; // INT -> int
printf("%D", X); // %D -> %d
Return 0; // Return -> return
}
2번의 세미콜론 또한 중요한대요, 명령어를 쓸 때마다 끝에 세미콜론을 써주어야 합니다. 세미콜론을 안 써놓은 코드를 주고 고치라는 문제가 나올 수도 있습니다! 이를 참고하여 아래 코드에서 잘못된 부분을 찾아보세요.
#include <stdio.h>
int main () {
int X = 100;
printf("%d", X);
return 0
}
바로 보이시죠? return 0에 세미콜론 ; 까지 붙여서 return 0;으로 작성해야 합니다.
∨ for문 ★★★★★
for문으로 코드 작성하는 문제 무조건 낸다고 보시면 됩니다. 그 중에서도 아마도 이중 반복문 문제 냅니다. 아래 계단 출력을 연습해봅시다. 이 예제는 너무 유명해서 따로 코드를 적진 않겠습니다.
*
**
***
****
*****
*****
****
***
**
*
*****
****
***
**
*
*
***
*****
이중 반복문과 더불어 가감식도 연습을 해두시길 바랍니다. 예를 들면 아래와 같이 i 값이 감소하는 경우의 반복문으로도 연습을 해보시고 while문으로도 계단 코드를 작성해보시길 바랍니다.
for (int i = 10 ; i > 0 ; i--)
아래는 제가 썼던 C언어 반복문 설명 부분인데 여기도 첫번째 계단 예제 내용과 코드가 있으니 참고하시면 도움 될 것 같습니다.
Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지 — 검정부기
Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지
안녕하세요! 이번 글에서는 반복문에 대해 배워보겠습니다. 반복문은 말 그대로 특정 동작을 반복해서 실행하는 코드입니다. 현대 컴퓨터의 핵심 역할 중 하나는 자동화라고 할 수 있는데, 반복
alittleboogie.tistory.com
∨ for문 <-> while문 ★★★★★
이중 for문을 이중 while문으로 바꾸거나 하여튼 for와 while을 서로 바꾸는 문제가 나올 가능성이 높습니다. 이 부분도 아래 글에서 설명하였으니 참고하시길 바랍니다.
Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지 — 검정부기
Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지
안녕하세요! 이번 글에서는 반복문에 대해 배워보겠습니다. 반복문은 말 그대로 특정 동작을 반복해서 실행하는 코드입니다. 현대 컴퓨터의 핵심 역할 중 하나는 자동화라고 할 수 있는데, 반복
alittleboogie.tistory.com
∨ 실수 유도! ★★★★★
C언어에서 자주 실수하는 부분 짚어 드리겠습니다. 이 부분은 필독이라고 생각합니다. 왜냐하면 시험에서 이 부분을 가지고 낚시할 게 뻔하거든요. 일단 실수할 만한 부분 짚어드리겠습니다.
- scanf 인자에 & 안쓰는 실수 ★★★★
- =와 ==를 헷갈리는 실수 ★★★★★
- 변수 초기화 안하는 실수 ★★★
- if와 else if 헷갈리는 실수 ★★★
- &와 &&, |와 || ★★
- 조건문, 반복문과 세미콜론 ; ★
- 수학에선 올바른 조건식 ★★★★★
- for, while 또는 if과 중괄호 ★★★
- <= 표기 잘못하는 경우 ★
- 참과 거짓을 나타내는 값 ★★★★
∨ scanf 인자에 & 안쓰는 실수 ★★★★
scanf로 입력을 받을 때는 형식 지정자와 변수를 맞춰주어야 합니다. 이와 더불어 변수 앞에 &(앰퍼샌드)를 써주어야 합니다. 이는 무조건 알아야 합니다. 꼭 시험 문제가 아니라 코딩을 할 때도 이 부분 때문에 오류가 자주 생기기 때문입니다. 이를 참고하여 다음 코드가 잘못된 부분을 찾아 고쳐봅시다.
#include <stdio.h>
int main () {
float num;
scanf("%d", num);
return 0;
}
scanf 함수에서 문제가 생기는 부분은 두 군데가 있습니다. 첫 번째는 float 형 데이터를 입력받기 때문에 %d가 아닌 %f 를 써주어야 합니다. 두 번째는 변수명 num 앞에 &를 써주어야 합니다. 즉, &num을 써주어야 하는 것인데, 이는 scanf가 변수 num이 있는 공간에 값을 넣어주기 위함입니다.
따라서 수정한 코드는 다음과 같습니다.
scanf("%f", &num);
∨ = 와 ==를 헷갈리는 문제 ★★★★★
아마 if문과 연계하여 나올 확률이 높으므로 if문 문제가 나왔다면 =와 ==를 헷갈리게 해서 틀리게 만드는 문제는 아닌 지 의심해봅시다. =는 대입 연산자로 변수에 값을 저장할 때 사용합니다. ==는 값이 같은 지 확인하는 연산입니다. 이를 참고하여 다음 문제의 출력을 예상하여 봅시다.
#include <stdio.h>
int main () {
int score = 80;
if (score = 90) {
printf("A");
}
if (score == 80) {
printf("B");
}
else if (score = 70) {
printf("C");
}
if (score = 0) {
printf("F");
}
}
좀 문제가 별로일 수도 있는데 어차피 핵심 개념이 중요한 것이므로.. 결과는 다음과 같습니다.
AC
설명은 주석으로 달겠습니다.
#include <stdio.h>
int main () {
int score = 80;
if (score = 90) { // score변수에 90을 대입함. 대입 연산자는 대입한 값 90을 반환하므로 if (90) 과 같다.
printf("A"); // 0이외의 값은 참이므로 if(참)이 되어 A를 출력하게 된다.
}
if (score == 80) { // 그 다음 if문에서 score이 80과 "같은 지" 확인한다.
printf("B"); // 같은 지 확인해본 결과, 같지 않았으므로 조건문은 실행되지 않는다.
}
else if (score = 70) { // 위 if문이 실행되지 않았으므로 else if문의 조건을 검사하게 된다.
printf("C"); // 여기서 ==가 아닌 =이므로 score에 70을 대입하고 대입 연산자는 70을 반환하여 printf문이 실행된다.
}
if (score = 0) { // score에 값 0을 대입하고, 대입 연산자는 0을 반환한다.
printf("F"); // 0은 거짓을 의미하므로 if문이 실행되지 않는다.
}
}
∨ 변수 초기화 안하는 실수 ★★★
C언어에서 값을 넣어주지 않고 선언만 한 변수는 어떤 값을 저장하고 있을까요? 예를 들면 아래의 number 변수처럼 선언만한 상태입니다.
int number;
이 number 변수에는 0이 자동으로 저장되는 것이 아닙니다. 대신, 해당 메모리 공간에 원래 들어 있던 값이 그대로 남아 있게 되며, 이를 쓰레기 값(garbage value)이라고 합니다. 따라서 초기화되지 않은 변수는 예측할 수 없는 값을 가지므로, 핵심은 이를 이용해 연산하거나 출력하는 것은 매우 위험합니다.
int sum;
sum += 10;
초기화도 안한 sum 변수에 10을 더하려고 하면 문제가 생깁니다. 아무값도 안들어 있는 상태이기 때문이죠. 이와 마찬가지로 sum을 printf문으로 출력하려 하는 것도 문제가 생깁니다.
∨ &와 &&, |와 || ★★
&랑 |는 비트 연산자라고 있는데 이거 아마 문제 안나올 가능성 크다고 봅니다. 알아두면 좋긴 한데... 공부하기 귀찮으면 안해도 괜찮다고 생각해요.. 어차피 나오면 70%는 틀릴 거라고 생각합니다. 솔직히 잘 안써서 그냥 스킵하시면 됩니다. 하드웨어 제어 쪽은 자주 쓴다고 들었는데 솔직히 저는 10번도 안써본거 같아요.
근데 여기서 중요한 건 &, && 둘다 AND 연산자이고, |, || 둘다 OR 연산자라는 것입니다. 이걸 헷갈리시면 안됩니다!
&는 비트 AND 연산자
|는 비트 OR 연산자
&&는 논리 AND 연산자 <-- 우리가 조건식에서 자주 쓰는 "그리고"
||는 논리 OR 연산자 <-- 우리가 조건식에서 자주 쓰는 "또는"
∨ if와 else if 헷갈리는 실수 ★★★
조건문에서 if문을 써야 하는지, else if문을 써야 하는지, else문을 써야 하는지, 아니면 if문을 이어 써야 하는지를 물어보는 문제입니다. 나올지는 모르겠지만 if문을 활용하는 능력은 중요하므로 이 내용을 넣었습니다.
이건 제가 if문 글에서 설명드린 내용인데 한 번 풀어보시겠습니까? 다음 코드에서 잘못된 부분을 고쳐 보세요.
/*값을 입력받아 3의 배수인지 5의 배수인지 확인하는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int num;
printf("값 입력:");
scanf("%d", &num);
// 변수 num이 3의 배수인 지 확인하는 조건식.
if (num % 3 == 0) {
printf("%d는 3의 배수이다.\n", num);
}
// 변수 num이 5의 배수인 지 확인하는 조건식.
else if (num % 5 == 0) {
printf("%d는 5의 배수이다.\n", num);
}
return 0;
}
무엇이 문제인 지 모르겠다면 직접 실행해보시는 것도 좋습니다. 9과 15를 넣어보세요. 아래 이 글에서 이 내용을 설명드렸으니 참고해보시면 될 것 같습니다. 정답만 말씀드리자면 if - else if 가 아니라 if - if 문으로 작성해야 합니다.
Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것. — 검정부기
Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것.
안녕하세요! 이번 글에서는 조건문인 if에 대해 배워보도록 하겠습니다. 조건문은 프로그램 실행 분기를 제어하는 중요한 문법입니다. 이제부터 본격적으로 코딩이 시작된다고 말할 수 있습니
alittleboogie.tistory.com
∨ 반복문과 세미콜론 ; ★
세미콜론 ;을 적절한 곳에 써주는 것도 중요하지만 쓰지 않아야 하는 곳에 쓰는 것도 문제가 생깁니다. 특히 이 잘못된 곳에 세미콜론을 써주는 문제는 if문, for문, while문에 주로 생길 수 있습니다. 이 부분도 자주 실수하는 포인트가 될 수 있으니 짚고 넘어가봅시다. if, for while문의 형식은 다음과 같습니다.
if (조건식) {
실행할 코드;
}
for (초기식;조건식;증감식) {
실행할 코드;
}
while(조건식) {
반복할 코드;
}
이를 참고하여 다음 코드의 출력 결과를 예상해봅시다.
#include <stdio.h>
int main(void) {
for (int i = 0; i < 5; i++); {
printf("Hello!! ");
}
return 0;
}
출력 결과는 다음과 같습니다. "Hello!! "를 5번 출력해야 할 것 같은데 무엇이 문제일까요?
Hello!!
정답은 for문 뒤에 세미콜론에 있습니다. 세미콜론 때문에 for문이 반복하는 즉시 세미콜론을 만나 아무 내용없는 코드만 반복하기 때문입니다. for문이 끝나고 나서 printf문을 만나 "Hello!! "를 한 번 출력하고 return 0;을 만나 프로그램은 종료하게 됩니다.
for (int i = 0; i < 5; i++); { // <-- i++); 여기서 세미콜론 ;을 빼야 한다!
printf("Hello!! ");
}
if문과 while문에서도 마찬가지입니다. 다음 코드의 출력 결과를 예상해보세요. while문은 if문을 반복시킨 것 뿐이므로 if문의 경우만 보도록 합시다.
#include <stdio.h>
int main(void) {
if (0); {
printf("hello");
}
return 0;
}
출력 결과는 다음과 같습니다. if(0)이어서 실행이 안될 것 같지만 뒤에 세미콜론 ;이 있기 때문에 "if (0); "이게 if문의 전부입니다. 따라서 그 뒤에 { printf("hello"); }는 if문과 별개인 코드가 됩니다.
hello
∨ 수학에선 올바른 조건식 ★★★★★ 괄호 적극적으로 쓰자!
솔직히 부분은 시험에 나올 진 미지수인데, 이 내용을 매우 강조하시는 교수님이 계시다고 들었습니다. 그래서 한번 보고 갑시다. 다음의 조건식이 논리적으로 올바르다고 생각하시나요?
if (2 < x < 5) {
printf("x는 2보다 크고 5보다 작다");
}
수학에선 2 < x < 5 가 아무 문제가 없는데 컴퓨터 과학에선 문제가 있습니다.. 이게 컴파일 에러는 아니고 비교 연산자인 <가 연산자 우선순위에 의해서 어째어째 계산을 하긴 할텐데 의도대로 실행은 되지 않습니다. 아래 코드 실행해보시면 x는 7인데 실행되는 것을 보실 수 있습니다.
#include <stdio.h>
int main(void) {
int x = 7;
if (2 < x < 5) {
printf("x는 2보다 크고 5보다 작다.");
}
return 0;
}
일단 이 식이 문제라는 것을 아는 것이 제일 중요하구요. 고치는 방법도 가볍게 알아보겠습니다.
(x > 2 && x < 5)
그냥 && 사용하면 됩니다. (2보다 크다 "그리고" 5보다 작다) 근데 사실 조건식 같은 경우는 조건식마다 괄호로 묶어주는 것이 의도도 확실하고 무엇보다 안전하니깐 괄호를 적극적으로 쓰는 것을 추천합니다.
((x > 2) && (x < 5)) // 이게 안전하긴 함. 괄호 적극적으로 쓰자.
∨ for 또는 if 등에서 중괄호★★★
이 부분도 문제에 나올 수도 있고 또 실제로 자주 범하게 되는 실수이므로 짚고 넘어갑시다. if문과 for문, while문들의 형식은 대개 비슷합니다. 실행할 코드, 또는 반복할 코드가 중괄호 {}로 감싸져 있다는 것인데요. 만약 실행할 코드, 또는 반복할 코드가 한 줄이라면 이 중괄호를 생략할 수 있습니다. 하지만 꼭 한 줄만 영향을 받습니다.
if (조건식) {
실행할 코드;
}
for (초기식;조건식;증감식) {
반복할 코드;
}
whlie (조건식) {
반복할 코드;
}
이를 참고하여 다음 코드의 결과를 예상해봅시다.
#include <stdio.h>
int main(void) {
for (int i = 0; i < 5; i++)
printf("hi ");
return 0;
}
어렵지 않았을 겁니다. 정답은 다음과 같습니다.
hi hi hi hi hi
그럼 다음 코드의 결과는 어떻게 될까요?
int main(void) {
for (int i = 0; i < 5; i++)
printf("hi ");
printf("world ");
return 0;
}
정답은 다음과 같습니다.
hi hi hi hi hi world
주의할 점은 for문 다음 줄을 들여쓰기한 것은 가독성을 위해서지 들여쓰기를 한다고 해서 for문에 포함되는 것은 아닙니다. for문으로 여러 코드를 감싸려면 중괄호 { }로 감싸야 합니다. 이는 별거 아니지만 실전에서는 긴장해서 실수할 수 있으니 인지만 하신다면 문제 없을 것 같습니다!
∨ <= 표기 잘못하는 경우 ★
컴퓨터 프로그래밍 시험은 수기로 진행됩니다. 따라서 컴퓨터에는 없는 표기를 하게 되면 감점 요소가 될 수 있는데요. 대표적으로 "크거나 같다"와 "작거나 같다"입니다. 컴퓨터에선 각각 ">=", "<="로 나타내야 합니다. 아래와 같이 표현하지 않도록 주의합시다. 이게 감점 요소가 될 지는 모르겠지만 혹시 모르니 지켜줍시다.

∨ 참과 거짓을 나타내는 값 ★★★★
이 내용 나올거라고 확신합니다. C언어에서는 참과 거짓을 값으로 나타낼 수 있습니다. 우선 거짓은 0으로 나타냅니다. 그리고 0 외 나머지 값들은 그냥 다 참입니다. -2도 참입니다. -1도 참입니다. '0'도 참입니다. ('0'은 아스키 코드값으로 48이어서 그렇습니다.) 이것만 알면 됩니다. 아마 조건식에 -1같은 값 넣고 낚으려는 문제 있을겁니다. 절대로 낚이시면 안됩니다. -1은 참입니다!!
∨ 참고 #define _CRT_SECURE_NO_WARNINGS
저도 이게 감점 요소인지는 모르겠는데, scanf() 함수는 보안 상의 이유로 그냥 썼을 경우 프로그램이 실행이 안됩니다. 그래서 scanf_s() 함수를 대신 쓰거나 프로그램 상단에 #define _CRT_SECURE_NO_WARNINGS를 쓰면 입력 기능을 문제 없이 사용할 수 있습니다.
쓰면서 모르시는 것이 있거나 하면 그냥 막 물어보셔도 됩니다. 아무런 댓글 다 상관없습니다. 쓰다가 생각났는데 컴프가 절대평가였죠? "이 개념은 나와도 다 틀릴거니 걱정안해도 될거다" 이야기 했는데 다 의미없었네요. 최대한 열심히 공부하셔서 좋은 성적 받으시길 바랍니다.
'강의 아카이브 > 컴퓨터 프로그래밍' 카테고리의 다른 글
| 컴퓨터 프로그래밍 : 기말 대비 (0) | 2026.04.23 |
|---|---|
| 컴퓨터 프로그래밍 : 중간 대비 문제 (0) | 2026.04.23 |
| 컴퓨터 프로그래밍 : 중간고사 요약 (0) | 2026.04.21 |
