[ 혼공C ] 2주차 : 변수와 연산자
본문 바로가기

혼공 스터디/혼자 공부하는 C언어

[ 혼공C ] 2주차 : 변수와 연산자

728x90
반응형

 

Chap 3. 변수와 데이터 입력

1. 변수

1) 변수 선언 방법

  • 자료형과 변수명을 나란히 쓴다.
  • 변수 : 메모리에 붙이는 임시 조소
  • 쓰레기 값이 있을 수 있으니 초기화가 필수적이다.

 

2) 정수 자료

  • 특별한 경우가 아니면 정수형을 표현할 때는 int를 사용하자!
    • int형은 연산의 기본 단위로 컴퓨터에서 가장 빠르게 연산된다.
    • short형은 int형보다 크기가 작아 메모리를 적게 사용하지만,
      연산 과정에서는 int형으로 변환되므로 실행 속도가 느려질 수 있다.
    • long long형은 크기가 8바이트이므로 int형으로 저장할 수 없는 큰 범위의 값을 저장할 수 있지만,
      메모리의 낭비가 크다.
  • long형은 큰 값을 저장할 때 사용하자!
    • 보통 컴파일러에서 int형은 4byte이지만 가끔 2byte로 수현된 컴파일러가 간혹 존재함.
    • 이때 큰 값을 저장하기 위해 long형을 사용한다.
    • int형과 long형의 크기를 동일하게 인식하는 컴파일러를 사용한다면 long형을 사용할 필요가 없음
  • 자료형의 크기를 알아내는 sizeof 연산자
    • printf("long long형의 크기 : %d바이트\n", sizeof(long long));

 

 

3) unsigned 정수 자료형

정수형은 보통 양수와 음수를 모두 저장하지만, 양수만 저장하면 두 배 더 넓은 범위의 값을 저장한다.

따라서 나이와 같이 음수가 없는 데이터를 저장할 때는 unsigned를 사용한다.

사용하는 법 자료형에 unsigned만 붙이면 됨

ex)  unsigned int a;

  • unsigned 자료형을 사용할 때 주의해야할 점
    • unsigned 변수에 큰 양수를 저장하고 %d로 출력하면 음수가 출력되고
    • unsigned 변수에 음수를 저장하고 %u로 출력하면 양수가 출력된다.
    • %d : 부호까지 생각해서 10진수로 출력하는 변환 문자
    • %u : 부호 없는 10진수로 출력하는 변환 문자
    • 따라서 unsigned 자료형을 사용할 때는 항상 양수만 저장하고 %u로 출력해야함

 

 

4) 실수 자료형

실수는 데이터를 구현하는 방법이 정수와 다르므로 별도의 자료형을 사용해야함

크기에 따라  float, double, long double로 구별하며, 값을 저장할 수 있는 범위가 다르다.

실수 자료형의 경우 값의 범위보다 유효 숫자의 개수가 더 중요!

 

결과가 이상하네

 

실수형은 저장하는 값에 따라 숫자가 정확하게 표현될 수도 있고 그렇지 않을 수도 있다.

float형은 유효 숫자 7자리, double형은 15자리 범위 내의 값을 사용하는 것이 좋다.

 

  • 정수형을 기본으로 사용하고 꼭 필요한 경우에만 실수형을 사용하자.
  • 실수형은 유효 숫자가 많은 double형을 기본으로 사용하자.

 

5) 문자열 저장

프로그램을 작성하다 보면 숫자뿐 아니라 "apple" 같은 문자열도 변수에 담아야 할 때가 많다.

이런 경우에는 char형을 배열 형태로 만들어 거기에 문자열을 저장한다.

 

char 배열명 [ 문자열길이 + 1 ]  =  문자열;

char fruit [ 6 ]  =  "apple"

 

문자열의 길이보다 배열의 크기를 하나 더 크게 잡는 이유

:: 컴파일러가 문자열의 끝에 \0(널문자)를 자동으로 추가하기 때문이다.

 

char 배열에 새로운 문자열을 저장하려면 strcpy 함수를 사용한다.

strcpy 함수를 사용하려면 소스코드에 string.h 헤더 파일을 포함시켜야한다.

 

 

6) const를 사용한 변수

변수는 저장 공간이므로 언제든 그 값을 바꿀 수 있지만, const를 사용한 변수는 그렇지 않아!

변수 선언할 때 그 앞에 const를 붙이면 초기화된 값을 바꿀 수 없다.

const를 사용하면 이후에는 값을 바꿀 수 없으므로 반드시 선언과 동시에 초기화 해야함.

초기화하지 않으면 변수의 쓰레기 값이 계속 사용됨.

 

 

 

 

7) 예약어와 식별자

  • 예약어 (reserved word/key word) :: 컴파일러와 사용 방법이 약속된 단어
  • 식별자(indentifier) :: 필요에 따라 만들어 사용하는 단어

 

  • 식별자 규칙
    • 알파벳 대문자, 소문자, 숫자, 밑줄로 만듬
    • 숫자로 시작할 수 없다.
    • 대문자와 소문자는 서로 다른 식별자로 인식
    • 예약어는 식별자로 사용불가

 

 

2. 데이터 입력

키보드에서 타이핑하는 모든 내용은 문자로 인식된다.

따라서 입력한 데이터를 연산이 가능한 정수나 실수로 사용하려면 변환이 필요한데

이때 사용하는 것이 바로 scanf(scan formatted) 함수이다.

 

입력 문자들을 스캔해 원하는 형태의 데이터로 바꿔준다.

어떤 데이터로 변환할 것인지는 변환 문자를 통해 결정됨.

scanf 함수에서 자료형에 따라 사용하는 변환 문자를 printf 함수로 출력할 때 사용하는 변환 문자와 거의 같다.

 

1) scanf 함수의 사용법

scanf 함수는 키보드에서 입력한 값을 변수에 저장할 때 사용한다.

  • 변수의 형태에 맞는 변환 문자를 사용하고 입력할 변수 앞에 &(앰퍼샌드)를 붙이면된다.

 

 

  • scanf 함수 유의점
    • scanf 함수에서 변수명을 지정할 때는 &를 붙여야 한다.
      scanf 함수를 사용할 때 가장 많이 하는 실수는 변수명 앞에 &를 빠뜨리는 것이다.
      변수의 값을 출력할 때는 변수명만 사용하지만, 입력할 때는 변수명 앞에 &를 붙여야한다.
    •  scanf 함수에서 사용한 변환 문자와 맞는 형태의 데이터를 입력해야한다.

 

  • scanf 함수의 응용
    • scanf 함수는 여러 개의 변환 문자를 나열해 한 번에 2개 이상의 변수에 값을 입력할 수 있다.

 

  • 입력할 때 주의할 점
    • 나이와 키를 splunk bar / tab / enter 중 하나로 구분해야한다.

 

 

2) 문자와 문자열의 입력

char형 변수에 문자를 입력할 때는 키보드로 입력하는 모든 문자가 대상이 된다.

즉, splace bar 나 enter도 하나의 문자로 전달된다.

문자열은 char 배열에 %s 변환 문자를 사용해서 입력하는데, 문자열을 입력할 때는 배열명에 &를 붙이지 않는다.

또한 스페이스나 엔터, 탭 등을 만나면 바로 전까지만 저장되므로 공백 없이 연속으로 입력해야한다.

기본 미션 1

 

 

 

Chap 4. 연산자

1. 산술 연산자, 관계 연산자, 논리 연산자

프로그램은 CPU가 처리하는 명령어의 묶음이다.

  • 피연산자
    • 연산의 대상이 되는 데이터
    • 상수와 변수만 있는 게 아니다.
    • 때로는 수식을 피연산자로 직접 사용할 수도 있음

혼자공부하는C언어 112쪽

  • 연산자
    • 컴파일되면 명령어로 바뀌는 것
    • 보통 기능에 따라 분류하지만 피연산자의 개수에 따라 나눌 수도 있다.
      • 단항 연산자, 이항 연산자, 삼항 연산자

 

 

1) 산술 연사자와 대입 연산자

 

(1) 산술 연산자

  • 더하기, 빼기, 곱하기, 나누기, 나머지 연산자
  • 모두 2개의 피연산자를 사용하며
  • 빼기 연산자는 피연산자를 하나만 사용할 때 피연산자의 부호를 바꾸는 역할도 한다.

 

 

 

(2) 대입 연산자... "="

 

(3) 증감 연산자

  1. 전위 표기(prefix)
    • 값이 변하고 나서 연산에 사용함
  2. 후위 표기(postfix)
    • 연산에 사용한 이후에 값이 변함

 

 

(4) 관계 연산자

  • 대소 관계 연산자
  • 동등 관계 연산자

 

<< 주의 :: = 와 == 의 차이 >>

  • = : 대입 연산자
  • == : 관계 연산

 

 

(5) 논리 연산자

  • && (AND)
  •  | |  (OR)
  •   !   (NOT)

 

<< 주의 :: 숏 서킷 룰 >>

  • && : 좌항이 거짓이면 우항과 관계 없이 결과가 거짓
  •  | |  : 좌항이 참이면 우항과 관계 없이 결과가 참

 

[ 좀 더 알아보기 1 :: 연산식이 처리되는 과정 ]

  1. 메모리에 있는 a와 b의 값을 CPU의 저장 공간인 레지스터에 복사 (로드)
  2. ALU에 의해 연산이 수행되고 결과값이 레지스터에 저장됨
  3. 메모리 공간에 복사되어 과정이 완료됨(스토어)

 

[ 좀 더 알아보기 2 :: 레지스터 VS 메모리 ]

  • CPU의 메모리
  • 연산할 데이터와 연산 후의 결과를 임시 저장함
  • CPU의 클럭과 1:1 동기화되어 있어 메모리에 비해 훨씬 빠름
  • 연산 결과를 메모리로 옮겨 놓지 않으면 그 값이 사라짐

4-1 확인문제 1

 

4-1 확인문제 2

 

 

2. 그 외 유용한 연산자

1) 형 변환 연산자

피연산자를 하나 가지며 피연산자의 값을 원하는 형태로 바꾼다.

피연산자의 값을 복사해 일시적으로 형태를 바꾸므로 

연산 후 메모리에 남아 있는 피연산자의 형태나 값은 변하지 않는다.

 

 

(1) 자동 형 변환

 

컴퓨터는 데이터의 형태에 따라 다른 연산 방법을 사용하기 때문에

피연산자가 2개 이상이라면 피연산자의 형태가 같아야 한다.

 

따라서 컴파일러는 컴파일 과정에서 피연산자의 형태가 다르면

형태를 일치시키는 작업을 수행하는데, 이를 자동 형 변환 또는 암시적인 형 변환, 묵시적인 형 변환이라 한다.

 

이런 형 변환의 기본 규칙은 데이터 크기가 작은 값이 크기가 큰 값으로 바뀌는 것 (정확한 연산을 위함)

정수(4 byte)와 실수(8byte)를 연산하면 정수가 실수로 자동 변환되어 연산됨

 

그러나 대입 연산은 메모리에 값을 저장하므로 무조건 좌항의 변수형에 맞게 저장

 

자동 형 변환은 형태가 다른 데이터를 자유롭게 연산할 수 있도록 도와주지만,

오차가 생길 수 있으니, 가능하면 피연산자의 형태를 같게 맞춰주는 것이 좋다.

 

 

2) sizeof 연산자

sizeof 연산자는 피연산자를 하나만 사용할 수 있으며

피연산자의 크기를 바이트 단위로 계산해서 알려준다.

sizeof(피연산자)로 표기하며 피연산자의 대상은 변수, 상수, 수식, 자료형 등이 될 수 있다!

 

연산자는 데이터의 크기를 확인하거나 메모리를 동적으로 할당하는 작업 등에 유용하게 사용

4-9 직접 해보는 손코딩
4-9 직접해보는 손코딩 경고 메시지

sizeof 연산의 결괏값 형태와 변환문자가 일치하지 않아서 나오는 경고!

컴파일러에 따라 다를 수 있으니 무시해도 좋다.

경고 메시지가 불편하면 변환문자를 %zd로 바꾸거나 다음 문장을 소스 코드 첫줄에 추가하면 된다.

 

(1) sizeof 연산자와 괄호

  • sizeof는 연산자이므로 기본적으로 피연산자에 괄호를 사용할 필요가 없다.
  • 하지만 수식으로 되어 있거나 변수 선언문이라면 괄호를 반드시 사용해야함.

 

 

3) 복합대입 연산자

대입 연산자(=)와 증감 연산자(++, --)를 제외한 다른 연산자는 연산하고 나서 피연산자의 값을 바꾸지 않는다.

연산 결과를 피연산자에 저장해야한다면 복합대입 연산자를 사용하면 간편하다.

 

복합대입 연산자는 연산 결과를 다시 피연산자에 저장한다.

 

산술 복합대입 연산자 5종

  • +=
  • -=
  • *=
  • /=
  • %=

 

 

4) 콤마 연산자

한 번에 여러 개의 수식을 차례로 나열해야 할 때 사용합니다.

콤마 연산자는 왼쪽부터 오른쪽으로 차례로 연산을 수행하며 가장 오른쪽의 피연산자가 최종 결괏값이 됨

 

콤마 연산자는 대입 연산자보다 우선순위가 낮은 유일한 연산자!

따라서 반드시 괄호가 필요함!

 

 

5) 조건 연산자

조건 연산자는 유일한 삼항 연산자로 ?와 : 기호를 함께 사용해 표현된다.

조건 연산자는 첫 번째 피연산자가 참이면 두 번째 피연산자가 결괏값이 되고,

첫 번째 피연산자가 거짓이면 세 번째 피연산자가 결괏값이 된다.

 

6) 비트 연산자

  1. 비트 논리 연산자
    • &
    • |
    • ^
  2. 비트 이동 연산자
    • >>
    • <<

 

(1) 비트별 논리곱 연산자 ( & )

  • 두 비트가 모두 1인 경우에만 1로 계산한다.

 

 

(2) 비트별 배타적 논리합 연산자 ( ^ )

  • 두 비트가 서로 다른 경우에만 1로 계산한다.

 

(3) 비트별 논리합 연산자 ( | )

  • 하나라도 참이면 1로 계산한다.

(4) 비트별 부정 연산자 ( ~ )

  • 피연산자가 하나이며, 피연산자의 비트를 반전시킴
  • 따라서 양수인 경우 부호 비트가 0에서 1로 바뀌므로 음수가 됨

 

(5) 비트 이동 연산자 ( << , >> )

  • <<은 비트를 왼쪽으로, >>는 오른쪽으로 이동시킨다.
  • 밀리는 비트는 사라지고 남는 비트는 0으로 채워진다.

 

 

7) 연산자 우선순위와 연산 방향

  • 단항 연산자 > 이항 연산자 > 삼항 연산자
  • 산술 연산자 > 비트 이동 연산자 > 관계 연산자 > 논리 연산

4-2 확인문제 2
도전 실전 예제!

 

728x90
반응형