c 언어 기초 그만 좀 보고 싶어서 빨리 끝내 보려고 합니다
1: 기초 프로그래밍 - 어느 프로그래밍 언어에서든 사용되는 개념들
핵심 정리 1: https://dojang.io/mod/page/view.php?id=58
핵심 정리
Visual Studio 사용하기
- 소스 코드 컴파일: 빌드(B) > 솔루션 빌드(B) 또는 F7
- 실행: 디버그(D) > 디버그하지 않고 시작(H) 또는 Ctrl+F5
문자열 출력
printf 함수는 화면(표준 출력)에 문자열을 출력하는 함수입니다.
printf("Hello, world!\n"); // Hello, world!
문자열 서식 지정자
printf로 문자열을 출력할 때는 서식 지정자로 %s를 사용합니다.
printf("%s\n", "Hello, world!"); // Hello, world!
%s를 두 번 사용했다면 각 %s에 들어갈 문자열을 , (콤마)로 구분하여 차례대로 넣어주면 됩니다.
printf("%s %s\n", "Hello", "1234"); // Hello 1234
서식 지정자의 내용과 출력할 문자열을 조합하여 최종 결과를 만들어냅니다. 특히 공백도 문자열의 한 부분이므로 출력 결과에 영향을 미칩니다.
printf("%s%s\n", "Hello", "1234"); // Hello1234 printf("%s, %s\n", "Hello,", "1234"); // Hello,, 1234
개행 문자(줄바꿈 문자)
\n을 사용하면 다음 줄로 넘어갑니다.
printf("Hello, world!\n"); printf("1234567890\n");
실행 결과
Hello, world!
1234567890
주석
주석은 소스 코드에 대한 설명을 작성하거나 코드를 임시로 컴파일 하지 않을 때 사용합니다.
// Hello, world! 출력 printf("Hello, world!\n"); /* 컴파일에서 제외 printf("Hello, world!\n"); printf("1234567890"); */
핵심 정리 2: https://dojang.io/mod/page/view.php?id=115
핵심 정리
변수 선언하기
변수는 자료형 변수이름 형식으로 선언합니다. 변수 여러 개를 한 번에 선언할 때는 자료형 변수1, 변수2, 변수3;과 같이 변수를 콤마로 구분해줍니다.
int num1;
float num2;
int num3, num4, num5;
변수를 선언하고 값 저장하기
변수에 값을 할당(저장)할 때는 변수 = 값; 형식으로 사용합니다.
int num1;
num1 = 10; // 변수에 10 할당(저장)
변수를 선언하면서 초기화하기
변수를 선언하면서 초기화할 때는 자료형 변수 = 값; 형식으로 사용합니다. 변수 여러 개를 선언하면서 초기화할 때는 자료형 변수1 = 값1, 변수2 = 값2;와 같이 변수와 값 할당을 콤마로 구분해줍니다.
int num1 = 10; // 변수를 선언하면서 값 할당(초기화)
int num2 = 20, num3 = 30; // 변수 여러 개를 선언하면서 값 할당(초기화)
자료형 크기 구하기
자료형이나 변수의 자료형 크기를 구할 때는 sizeof 연산자를 사용합니다.
sizeof(int); // 자료형 자체의 크기 구할 때는 반드시 ( )를 지정
int num1;
sizeof(num1); // ( )를 지정하는 방법
sizeof num1; // ( ) 없이 표현식으로 지정하는 방법
정수 자료형의 오버플로우와 언더플로우
- 부호 있는 정수: 오버플로우가 발생하면 최솟값(음수)부터 다시 시작, 언더플로우가 발생하면 최댓값(양수)부터 점점 작아집니다.
- 부호 없는 정수: 오버플로우가 발생하면 0부터 다시 시작, 언더플로우가 발생하면 최댓값부터 점점 작아집니다.
limits.h에 정의된 정수 자료형의 최솟값과 최댓값
limits.h 헤더 파일에는 정수 자료형의 최솟값과 최댓값이 정의되어 있습니다.
▼ 표 정수 자료형의 최솟값과 최댓값
자료형 | 최솟값 | 최댓값 |
char | CHAR_MIN | CHAR_MAX |
short | SHRT_MIN | SHRT_MAX |
int | INT_MIN | INT_MAX |
long | LONG_MIN | LONG_MAX |
long long | LLONG_MIN | LLONG_MAX |
unsigned char | 0 | UCHAR_MAX |
unsigned short | 0 | USHRT_MAX |
unsigned int | 0 | UINT_MAX |
unsigned long | 0 | ULONG_MAX |
unsigned long long | 0 | ULLONG_MAX |
stdint.h에 정의된 정수 자료형의 최솟값과 최댓값
stdint.h 헤더 파일에는 크기가 표시된 정수 자료형의 최솟값과 최댓값이 정의되어 있습니다.
▼ 표 크기가 표시된 정수 자료형의 최솟값과 최댓값
자료형 | 최솟값 | 최댓값 |
int8_t | INT8_MIN | INT8_MAX |
int16_t | INT16_MIN | INT16_MAX |
int32_t | INT32_MIN | INT32_MAX |
int64_t | INT64_MIN | INT64_MAX |
uint8_t | 0 | UINT8_MAX |
uint16_t | 0 | UINT16_MAX |
uint32_t | 0 | UINT32_MAX |
uint64_t | 0 | UINT64_MAX |
지수 표기법
지수 표기법(과학적 표기법)은 정수 부분은 한 자릿수만 적고, 소수 자릿수 뒤에 e와 지수를 표기합니다.
- 2.1e+3: 2100
- 2.1e-2: 0.021
지수 표기법과 부동소수점
지수 표기법은 실수를 소스 코드에 표기하거나 화면에 출력하는 방법이며 부동소수점 방식은 실수를 메모리 또는 디스크에 저장하는 방식입니다.
실수 자료형의 오버플로우와 언더플로우
실수 자료형은 오버플로우가 발생하면 inf(무한대)가 되며 언더플로우가 발생하면 0이 됩니다.
float.h에 정의된 최솟값과 최댓값
float.h 헤더 파일에는 실수 자료형의 최솟값과 최댓값이 정의되어 있습니다.
▼ 표 실수 자료형의 최솟값과 최댓값
자료형 | 크기 | 범위 |
float | FLT_MIN | FLT_MAX |
double | DBL_MIN | DBL_MAX |
long double | LDBL_MIN | LDBL_MAX |
숫자 서식 지정자
printf로 정수나 실수를 출력할 때는 다음과 같은 서식 지정자를 사용합니다.
▼ 표 숫자 서식 지정자
서식 지정자 | 설명 |
%d | 부호 있는 정수 |
%ld | 부호 있는 long 정수 |
%lld | 부호 있는 long long 정수 |
%u | 부호 없는 정수 |
%lu | 부호 없는 long 정수 |
%llu | 부호 없는 long long 정수 |
%f | float, double형 실수 |
%Lf | long double형 실수 |
%e | float, double형 실수를 지수 표기법으로 출력 |
%Le | long double형 실수를 지수 표기법으로 출력 |
버그
버그는 프로그램이 의도하지 않은 동작을 일으키는 것을 말합니다.
디버거
디버거는 프로그램의 내부 상황을 보여주는 도구이며 버그를 쉽게 찾을 수 있도록 도와줍니다.
중단점
중단점은 브레이크 포인트라고도 부르며 소스 코드의 특정 지점에서 프로그램을 멈추는데 사용합니다.
Visual Studio 디버거 사용하기
- 중단점 삽입/삭제: 소스 코드 편집 창에서 마우스 오른쪽 버튼 클릭하고 중단점(B) > 중단점 삽입(R) 또는 F9
- 디버깅 시작: 디버그(D) > 디버깅 시작(S) 또는 F5
- 디버깅 중지: 디버그(D) > 디버깅 중지(E) 또는 Shift+F5
- 프로시저 단위 실행: 디버그(D) > 프로시저 단위 실행(O) 또는 F10
- 한 단계씩 코드 실행: 디버그(D) > 한 단계씩 코드 실행(I) 또는 F11
핵심 정리 3: https://dojang.io/mod/page/view.php?id=194
핵심 정리
문자 표기하기
문자는 'a'와 같이 작은따옴표로 묶어서 표기합니다.
문자 서식 지정자
문자는 printf함수에서 문자를 출력할 때는 서식 지정자로 %c를 사용합니다.
printf("%c\n", 'a'); // a
문자와 정수
문자, 숫자, 제어 문자는 0부터 255까지 정수에 대응되며 이 규칙을 ASCII 코드라고 부릅니다.
자주 사용하는 제어 문자
▼ 표 LF, CR, TAB 제어 문자의 ASCII 코드
10진수 | 16진수 | 문자 | 표기법 | 설명 |
10 | 0x0A | LF | \n | 개행, 라인 피드(Line Feed), 새 줄(newline), 줄바꿈 |
13 | 0x0D | CR | \r | 복귀, 캐리지 리턴(Carriage Return), 줄의 끝에서 시작 위치로 되돌아감 |
9 | 0x09 | TAB | \t | 수평 탭(horizontal tab) |
리터럴과 상수
리터럴은 값 그 자체를 뜻합니다. 상수는 const를 붙여서 선언하며 리터럴이 저장된 공간입니다. 특히 상수는 한 번 선언한 뒤에는 값을 변경할 수 없습니다.
// 리터럴
printf("%d\n", 10);
printf("%f\n", 0.1f);
printf("%c\n", 'a');
printf("%s\n", "Hello, world!");
// 상수
const int con1 = 1;
const float con2 = 0.1f;
const char con3 = 'a';
정수 리터럴 접미사
접미사는 정수 리터럴의 크기와 부호 유무를 명시적으로 표기할 때 사용합니다.
▼ 표 정수 리터럴 접미사
접미사 | 자료형 |
생략 | int |
l, L | long |
u, U | unsigned int |
ul, UL | unsigned long |
ll, LL | long long |
ull, ULL | unsigned long long |
실수 리터럴 접미사
접미사는 실수 리터럴의 크기를 명시적으로 표기할 때 사용합니다.
▼ 표 실수 리터럴 접미사
접미사 | 자료형 |
f, F | float |
생략 | double |
l, L | long double |
입력 값을 변수에 저장하기
입력 값을 변수에 저장할 때는 scanf 함수를 사용하며 변수 앞에는 &를 붙여줍니다.
- %d: 정수
- %f: 실수
- %c: 문자
int num1;
float num2;
char c1;
scanf("%d %f %c", &num1, &num2, &c1);
문자 입출력 함수
getchar 함수는 표준 입력에서 문자 하나를 입력받고, putchar 함수는 화면(표준 출력)에 문자 하나를 출력합니다.
char c1 = getchar(); // 표준 입력에서 문자 하나를 입력받은 뒤 결과를 반환
putchar(c1); // 문자 하나를 화면(표준 출력)에 출력
핵심 정리 4: https://dojang.io/mod/page/view.php?id=272
핵심 정리
산술 연산자
C 언어에서 사용할 수 있는 산술 연산자는 다음과 같습니다.
▼ 표 C 언어 산술 연산자
연산자 | 설명 | |
+ | 덧셈 | |
- | 뺄셈 | |
* | 곱셈 | |
/ | 나눗셈 | |
% | 나머지(정수를 나눈 뒤 나머지만 구함) | |
+= | 덧셈 후 할당 | |
-= | 뺄셈 후 할당 | |
*= | 곱셈 후 할당 | |
%= | 나머지를 구한 후 할당 | |
전위 | ++a | 1 증가, b = ++a; 증가 후 할당 |
--a | 1 감소, b = --a; 감소 후 할당 | |
후위 | a++ | 1 증가, b = a++; 할당 후 증가 |
a-- | 1 감소, b = a--; 할당 후 감소 |
0으로 나누기
정수는 0으로 나누거나, 0으로 나머지 연산을 할 수 없습니다. 만약 0으로 나누었을 때는 다음과 같은 에러가 발생합니다.
컴파일 에러
error C2124: 0으로 나누기 또는 나머지 연산을 수행했습니다.
실행 에러
0xC0000094: Integer division by zero.
자료형의 확장과 축소
서로 다른 자료형으로 연산을 했을 때 자료형의 크기가 큰 쪽, 표현 범위가 넓은 쪽으로 변환하는 것을 형 확장(type promotion)이라고 하고, 자료형의 크기가 작은 쪽, 표현 범위가 좁은 쪽으로 변환하는 것을 형 축소(type demotion)라고 합니다. 특히 형 축소는 값의 손실이 발생합니다.
핵심 정리 5: https://dojang.io/mod/page/view.php?id=325
핵심 정리
특정 조건일 때 코드를 실행하기
if조건문에 조건식을 지정하면 해당 조건이 만족할 때만 코드를 실행할 수 있습니다.
if (조건식)
{ 코드
// 조건식이 만족할 때 코드 실행
}
두 방향으로 분기하기
if와 else를 사용하면 조건식이 만족할 때와 만족하지 않을 때 각각 다른 코드를 실행할 수 있습니다.
if (조건식) {
코드1 // 조건식이 만족할 때 코드 실행 }
else {
코드2 // 조건식이 만족하지 않을 때 코드 실행 }
여러 방향으로 분기하기
else if는 여러 개의 조건식을 지정하여 각각 다른 코드를 실행할 수 있습니다.
if (조건식1) {
코드1 // 조건식1이 만족할 때 코드 실행
} else if (조건식2) {
코드2 // 조건식2가 만족할 때 코드 실행
} else if (조건식3) {
코드3 // 조건식3이 만족할 때 코드 실행
} else {
코드4 // 아무 조건에도 만족하지 않을 때 코드 실행 }
조건식과 == 연산자
조건식을 작성할 때 == 연산자 대신 = 연산자를 사용하는 실수를 하지 않도록 주의합니다.
if (num1 == 1) // 올바른 조건식 { }
if (num1 = 1) // 잘못된 조건식 { }
참과 거짓
C 언어에서는 거짓은 0, 참은 0이 아닌 값이며 보통 1을 사용합니다.
핵심 정리 6: https://dojang.io/mod/page/view.php?id=490
비트 연산자
비트 연산자는 값을 비트 단위로 연산합니다.
▼ 표 C 언어 비트 연산자
연산자 | 설명 |
& | 비트 AND |
| | 비트 OR |
^ | 비트 XOR (배타적 OR, Exclusive OR) |
~ | 비트 NOT |
<< | 비트를 왼쪽으로 시프트 |
>> | 비트를 오른쪽으로 시프트 |
&= | 비트 AND 연산 후 할당 |
|= | 비트 OR 연산 후 할당 |
^= | 비트 XOR 연산 후 할당 |
<<= | 비트를 왼쪽으로 시프트한 후 할당 |
>>= | 비트를 오른쪽으로 시프트한 후 할당 |
부호 있는 자료형의 비트 연산
부호 있는 자료형의 비트를 오른쪽으로 이동시키면 모자라는 공간은 부호 비트의 값으로 채워집니다. 그리고 비트를 왼쪽으로 이동시키면 부호 비트를 덮어쓰게 되므로 부호가 바뀔 수 있습니다.
1000 0000 (-128)
_________ >> 2
1110 0000 (-32)
0010 0000 (32)
_________ << 2
1000 0000 (-128)
비트 연산자로 플래그 처리하기
플래그의 비트를 조작하거나 검사할 때 사용하는 숫자를 마스크(mask)라고 부릅니다.
▼ 표 플래그 연산 방법
연산 방법 | 설명 |
flag |= mask | 플래그의 특정 비트를 켬 |
flag &= ~mask | 플래그의 특정 비트를 끔 |
flag ^= mask | 플래그의 특정 비트를 토글시킴 |
flag & mask | 플래그의 특정 비트가 켜져 있는지 검사 |
연산자 우선순위
각 연산자는 우선순위가 있으며 우선순위가 높은 순서대로 계산됩니다.
▼ 표 C 언어 연산자 우선순위
우선순위 | 연산자 | 설명 | 결합 법칙(방향) |
1 |
x++ x-- ( ) [ ] . -> (자료형){값} |
증가 연산자(뒤, 후위) 감소 연산자(뒤, 후위) 함수 호출 배열 첨자 구조체/공용체 멤버 접근 포인터로 구조체/공용체 멤버 접근 복합 리터럴 |
→ |
2 |
++x --x +x -x ! ~ (자료형) *x &x sizeof |
증가 연산자(앞, 전위) 감소 연산자(앞, 전위) 단항 덧셈(양의 부호) 단항 뺄셈(음의 부호) 논리 NOT 비트 NOT 자료형 캐스팅(자료형 변환) 포인터 x 역참조 x의 주소 자료형의 크기 |
← |
3 |
* / % |
곱셈 나눗셈 나머지 |
→ |
4 |
+ - |
덧셈 뺄셈 |
→ |
5 |
<< >> |
비트를 왼쪽으로 시프트 비트를 오른쪽으로 시프트 |
→ |
6 |
< <= > >= |
작음 작거나 같음 큼 크거나 같음 |
→ |
7 |
== != |
같음 다름 |
→ |
8 | & | 비트 AND | → |
9 | ^ | 비트 XOR | → |
10 | | | 비트 OR | → |
11 | && | 논리 AND | → |
12 | || | 논리 OR | → |
13 | ? : | 삼항 연산자 | ← |
14 |
= += -= *= /= %= <<= >>= &= ^= |= |
할당 덧셈 후 할당 뺄셈 후 할당 곱셈 후 할당 나눗셈 후 할당 나머지 연산 후 할당 비트를 왼쪽으로 시프트한 후 할당 비트를 오른쪽으로 시프트한 후 할당 비트 AND 연산 후 할당 비트 XOR 연산 후 할당 비트 OR 연산 후 할당 |
← |
15 | , | 쉼표(콤마) 연산자 | → |
연산자 우선순위와 괄호
우선순위가 낮은 연산자를 먼저 계산할 때는 괄호로 묶어줍니다.
num1 = (35 + 1) * 2; // 괄호를 사용하여 35 + 1을 먼저 계산한 뒤 2를 곱함
핵심 정리 7: https://dojang.io/mod/page/view.php?id=506
핵심 정리
다양한 조건 처리하기
switch 분기문은 변수의 값에 따라 다양한 조건을 처리할 수 있습니다. 단, 조건식은 지정할 수 없으며 변수는 반드시 정수형이라야 합니다. 따라서 switch 분기문은 형식이 균일하며 처리해야 할 조건이 많을 때 사용합니다.
switch (변수)
{ case 숫자1:
코드1 break;
case 숫자2:
코드2 break;
default: 코드3;
break; }
반복할 횟수를 지정하여 반복하기
for 반복문은 반복 횟수를 지정하여 반복할 수 있습니다. 초기식에는 반복을 시작할 값을 지정하고, 조건식에는 얼마나 반복할지 지정하며 변화식은 반복할 때마다 루프 인덱스 변수(i)가 얼마나 변화할지 지정합니다.
// 초기식 조건식 변화식
// ↓ ↓ ↓
for (int i = 0; i < 100; i++) { 반복할 코드 }
반복할 횟수가 정해져 있지 않을 때 반복하기
while 반복문은 반복 횟수가 정해져 있지 않을 때, 논리 조건에 따라 반복 여부를 결정할 때 사용합니다. 조건식이 만족하면 계속 반복하고, 만족하지 않으면 반복을 끝냅니다(예를 들어 데이터를 다 읽을 때까지 반복하는 경우).
초기식
while (조건식)
{ 반복할 코드 조건식의 결과에 영향을 주는 코드(변화식) }
최소 한 번은 실행하기
do while 반복문은 코드를 최소 한 번은 실행하며 그 이후에는 조건에 따라 반복합니다. 즉, do 부분은 조건식과는 상관없이 한 번은 실행하며 조건이 만족하면 반복하고, 만족하지 않으면 반복을 끝냅니다. 또한, 반복 횟수가 정해져 있지 않을 때 유용합니다.
초기식 do // ↓ 조건식과는 상관없이 한 번은 실행됨 {
반복할 코드 조건식의 결과에 영향을 주는 코드(변화식) }
while (조건식)
반복문 끝내기
반복문에서 break를 사용하면 반복문을 끝낼 수 있습니다.
while (조건식1)
{ if (조건식2)
break; // 반복문을 끝냄 }
반복문의 코드 건너뛰기
반복문에서 continue를 사용하면 반복문의 일부 코드를 건너뛸 수 있습니다. 단, 반복문을 끝내지 않고 계속 반복합니다.
while (조건식1)
{ if (조건식2)
continue; // 아래 코드를 건너뛴 뒤 계속 반복함
코드; }
중첩 루프
반복문 안에 반복문이 들어 있는 형태를 중첩 루프라고 하며 루프 인덱스 변수는 i부터 순서대로 짓습니다.
- 예) i, j, k
중첩 루프는 주로 가로x세로 형태로 된 2차원 평면을 다룰 때 사용합니다
for (int i = 0; i < 10; i++) // 바깥쪽 루프
{ for (int j = 0; j < 10; j++) // 안쪽 루프 { } }
핵심 정리 8: https://dojang.io/mod/page/view.php?id=636
핵심 정리
원하는 부분으로 즉시 이동하기
goto에 레이블을 지정하면 해당 레이블로 즉시 이동합니다. goto는 중첩 루프를 빠져나오거나, switch에서 바깥의 반복문을 빠져나올 때 주로 사용합니다.
FizzBuzz 문제의 의도
FizzBuzz 문제는 겉으로 보기에는 if 조건문과 나머지 연산자를 사용하는 방법을 묻는 것 같지만 실제로는 요구사항을 정확히 파악하여 구현했는지를 평가하는 문제입니다.
가장 많이 실수하는 부분은 3과 5의 공배수인데도 3의 배수로만 처리한다거나, 5의 배수로만 처리하고 넘어가는 것입니다. 제시된 요구사항을 순서대로 if, else if, else로 만들다 보면 이런 실수를 하게 되죠. 따라서 문제의 요구사항을 정확히 파악하여 중요한 내용이 무엇인지 확인하고, 놓친 부분은 없는지 살펴봐야 합니다(여기서는 공배수 처리 부분이겠죠?).
'자린고비 독학하기 > 자린고비 코딩하기' 카테고리의 다른 글
C 언어 코딩 도장 빨리 끝내기 - 3 : 배열 / 문자열 (0) | 2020.03.22 |
---|---|
C 언어 코딩 도장 빨리 끝내기 - 2 : 포인터 (0) | 2020.03.19 |
C++ : namespace, std::, 이름 공간, 범위지정 연산자, 접두어, using, usingnamespace std (0) | 2020.02.14 |
C 15강 - 구조체 (0) | 2020.02.13 |
나동빈 JAVA 16 - extends (0) | 2020.02.03 |