본문 바로가기
혼공단 12기(혼공C)

[혼공C] 2주차 변수와 데이터 입력, 연산자

by 눈 떠 보니 공대생 2024. 7. 14.

주차 진도 기본 숙제 추가 숙제
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