주차 | 진도 | 기본 숙제 | 추가 숙제 |
2주차(7.8~7.14) | Chapter 3~4 | 3-2 확인문제 4-2 확인문제 |
Chapter 4 도전 실전 예제 |
<기본 숙제: 3-2 확인 문제>
1. 다음과 같이 변수가 선언되어 있을 때, scanf 함수의 사용법이 옳은 것을 고르세요.
char ch; short sh; int in; float ft; double db; |
① scanf("%d", &ch); ② scanf("%d", &sh); ③ scanf("%d%f", &in, &ft); ④ scanf("%f", &db); |
정답: ③
① char: %c 사용
② short: %hd 사용
④ double: %lf 사용
2.
[코드]
[실행 결과]
3.
[코드]
[실행 결과]
<기본 숙제: 4-2 확인 문제>
1.
[코드]
[실행 결과]
2.
[코드]
[실행 결과]
3.
[코드]
[실행 결과]
<추가 숙제: Chapter 4 도전 실전 예제>
[코드]
[실행 결과]
Chapter 3. 변수와 데이터 입력
1. 변수
1) 변수 선언 방법
<자료형> <변수명> <;> e.g.) int a;
변수 선언하면 메모리에 저장 공간 생김 → default value: garbage value
→ initialization 필요; “=” (대입 연산자: 오른쪽 값을 왼쪽 값에 할당) 사용
** 변수 선언과 대입 규칙
규칙 1. {} 안에 변수 선언, 선언 위치부터 블록 끝까지 사용
규칙 2. 변수의 자료형 동일 -> 동시에 둘 이상의 변수 선언 e.g.) int b, c;
규칙 3. 대입 연산자: 연산자 왼쪽 변수에, 오른쪽의 값 할당 e.g.) <변수> = <상수, 변수, 수식>
규칙 4. 변수가 대입 연산자 왼쪽 -> 저장 공간(l-value), 연산자의 오른쪽 -> 값(r-value)
2) 정수 자료형
char | short | int | long | long long |
1byte | 2bytes | 4bytes | 4bytes | 8bytes |
컴파일러: 문자를 아스키코드값(0~127)으로 처리 -> %d, %c 즉 변환문자에 따라 출력 형태 달라짐
** 자료형의 크기: sizeof 연산자 이용
3) unsigned 정수 자료형
양수만 사용할 때.
다음의 코드 내용 주의!
#include <stdio.h>
int main(){
unsigned int a;
a = 4294967295;
printf(“%d”, a); //-1
a = -1;
printf(“%u”, a); //4294967295
※ 4294967295와 -1은 메모리에 저장된 형태가 (11111111 11111111 11111111 11111111)로 동일
→ %d는 부호비트 고려 → 음수 → -1
→ %u는 부호비트 고려 X → 양수 → 4294967295
즉, unsigned형 변수에도 음수 저장, 출력이 가능하나, 부호비트 고려 X, 항상 양수로 처리하므로 결과가 예상과 달라질 수 있음.
4) 실수 자료형
float | double | long double |
4bytes | 8bytes | 8+ bytes |
유효 7자리 | 15 | 15+ |
**부동소수점 -> 오차 발생
5) 문자열 저장
char형을 배열 형태로 만들어 저장
char fruit[6] = “apple”;
왜 문자열의 길이 + 1? \0 널문자 null character 때문!
** 배열에는 대입 연산자 사용 불가
배열은 선언된 이후 대입 연산자로 문자열 입력 불가능
-> l-value는 자료형의 크기가 일정해야 하기 때문
-> strcpy 함수 사용(string.h)
6) const를 사용한 변수
변수 = 저장 공간 -> 값 변화 가능
But 변수 선언 시 const 사용 -> 초기화된 값 바꿀 수 X(선언과 초기화 동시에)
Const 사용 이유
- 값이 바뀌지 않음 보장
- 변수의 특성 가짐 -> 주소 연산자로 메모리 위치 알 수 있음, 사용 범위의 제한 규칙 적용됨
7) reserved word(key word) & identifier
예약어: 컴파일러가 사용법 지정한 단어 e.g. 자료형, while, for, …
식별자: 필요에 따라 사용자가 지정하는 단어 e.g. 변수명, 사용자 정의 함수 명 등
2. 데이터 입력
1) scanf 함수의 사용법
scanf: 키보드에서 입력한 값을 변수에 저장할 때 사용. 메모리에 직접 접근
e.g. int a; // scanf(“%d”, &a);
변수 형태에 맞는 변환 문자, &(앰퍼센드) + 변수
** 유의할 점
1. &<변수명>. 단, 배열의 경우에는 & 사용 X
2. 변환 문자와 맞는 형태의 데이터 입력
2) scanf 함수의 응용
scanf(“%lf%d”, &a, &b); → 키보드 입력: 스페이스, 탭, 엔터 등으로 구분
2) 문자와 문자열의 입력
문자열 – char 배열에 %s 변환문자 사용해 입력. & 사용 X
널문자는 scanf가 자동으로 붙임(1바이트 여유 있게 배열 선언)
Chapter 4. 연산자
1. 산술 연산자, 관계 연산자, 논리 연산자
1) 산술 연산자와 대입 연산자
(1) 산술 연산자: +, -, *, /, %(나머지)
(2) 대입 연산자: =
#include <stdio.h>
int main(){
int a, b;
int sum, sub, mul, inv;
a = 10; // 값을 변수에 저장
b = 20;
sum = a + b; // 연산 결괏값을 변수에 저장
sub = a – b;
mul = a * b;
inv = -a;
printf(“a의 값 : %d, b의 값: %d\n”, a, b);
printf(“덧셈 : %d\n”, sum);
printf(“뺄셈 : %d\n”, sub);
printf(“곱셈 : %d\n”, mul);
printf(“a의 음수 연산 : %d\n”, inv);
return 0;
}
(3) 나누기 연산자와 나머지 연산자
나머지 연산자의 피연산자: 정수
2) 증감 연산자
a = a + 1 ⇔ ++a
a = a – 1 ⇔ --a
(1) 전위 표기와 후위 표기(prefix, postfix)
#include <stdio.h>
int main(){
int a = 5, b = 5;
int pre, post;
pre = (++a) * 3; // 18
post = (b++) * 3; // 15
printf(“증감 연산 후 초깃값 a = %d, b = %d\n”, a, b);
printf(“전위형: (++a) * 3 = %d, 후위형: (b++) * 3 = %d\n”, pre, post);
return 0;
}
3) 관계 연산자: 대소 관계 연산자, 동등 관계 연산자; 결괏값 0(false), 1(true)
4) 논리 연산자: &&, ||, !
** 숏 서킷 룰(short circuit rule): 좌항만으로 연산 결과 판별
&&: 좌항 거짓 or ||: 좌항 참 → 우항 실행XXX
5) 연산의 결괏값을 처리하는 방법
#include
int main(){
int a = 10, b = 20, res;
a + b; // 연산 결과 버려짐
printf(“%d + %d = %d\n”, a, b, a + b);
res = a + b;
printf(“%d + %d = %d\n”, a, b, res);
return 0;
}
** 연산식이 컴퓨터 내부에서 처리되는 과정
e.g. sum = a + b
1. 로드: 메모리의 값 -> 레지스터 복사
CPU (Register) | 메모리 | |
10 20 |
← 로드 | 10 | 변수 a 20 | 변수 b |
2. 연산
CPU – ALU: 연산 수행, 레지스터에 저장
CPU(Register) |
10 20 30 |
3. 스토어
CPU(Register) | 메모리 | |
10 20 30 |
→ 스토어 | 10 | 변수 a 20 | 변수 b 30 | 변수 sum |
** CPU의 메모리 vs 메모리 RAM
레지스터: 연산할 데이터 및 연산 후의 결과 임시 저장, CPU의 클럭 1:1 동기화 → RAM에 비해 매우 빠름
2. 그 외 유용한 연산자
1) 형 변환 연산자
(1) 형 변환 연산자: 피연산자의 값을 복사하여 일시적으로 형태 변환(메모리의 피연산자 값 변화X)
(자료형)피연산자 e.g. (int)10.7 = 10
(2) 자동 형 변환(암시적인 형 변환, 묵시적인 형 변환): 데이터 크기 작은 값 → 큰 값
2) sizeof 연산자: 피연산자의 크기를 바이트 단위로 알려줌
sizeof(피연산자) : 편의상 괄호 사용(함수가 아님!!)
피연산자: 자료형, 변수, 상수, 수식 등 – 배열의 크기 확인도 가능(자료형 * 배열의 크기)
3) 복합대입 연산자: 가장 마지막에 계산
(prefix → 복합대입 → postfix)
a = a + 5 ⇔ a += 5
4) 콤마 연산자
"," : 여러 개의 수식을 한 번에 차례로 나열(왼쪽 → 오른쪽으로 연산 수행)
#include <stdio.h>
int main(){
int a = 10, b = 20;
int res;
res = (++a, b++);
printf(“a: %d, b: %d\n”, a, b); // a = 11, b = 21
printf(“res: %d\n”, res); // res = 21
return 0;
}
3) 조건 연산자(연산자보다는 제어문에 가까움)
(조건식) ? (참) : (거짓)
e.g. res = (a > b) ? a : b
** 조건 연산자의 피연산자에 대입식 사용하기
e.g. (a > b) ? (res = a) : (res = b)
- 참 거짓일 때 결과 반영 대상이 다를 경우 유용
- 매크로 함수에 사용하면 좋음
- 가독성 저하 -> 필요할 때에만 사용
4) 비트 연산자: 정수에만 사용 가능
비트 논리 연산자 | |
& and | 비트별로 논리곱 |
| or | 비트별로 논리합 |
^ xor | 비트별로 배타적 논리합 |
~ not | 비트 반전 |
비트 이동 연산자 | |
<< | 비트 왼쪽으로 오른쪽의 남는 비트는 0 |
>> | 비트 오른쪽으로 왼쪽 남는 비트는 부호 따라(음수 – 1, 양수 – 0) |
&=, |=, ^=, <<=, >>= 사용 가능
5) 연산자 우선순위와 연산 방향
단항 > 이항 > 삼항
산술 > 비트 이동 > 관계 > 논리 연산
'혼공단 12기(혼공C)' 카테고리의 다른 글
[혼공C] 6주차 포인터 (0) | 2024.08.18 |
---|---|
[혼공C] 5주차 배열 (0) | 2024.08.06 |
[혼공C] 4주차 함수 (0) | 2024.07.28 |
[혼공C] 3주차 선택문, 반복문 (3) | 2024.07.20 |
[혼공C] 1주차 상수와 데이터 출력 (0) | 2024.07.07 |