C언어 변수

Minimal_user·2024년 5월 3일

c언어

목록 보기
4/17

1. 자료형

  • 기본형
    • 정수형
    • 문자형
    • 실수형
    • 열거형 (가능한 값들에 대한 나열형)
    • void형 (타입이 정해지지 않은 자료형)
  • 유도형
    • 배열 (같은 타입의 자료 집합)
    • 구조체 (다른 타입의 자료 집합)
    • 공용체 (메모리를 공유하는 자료 집합)
    • 포인터 (대상체의 번지를 가리키는 타입)
    • 함수형 (함수의 번지를 가리키는 타입)

2. 변수의 선언

  • 타입 변수명[=초기값][, 변수명, 변수명, ...];
  • 예시
int Num; // 성능을 우선시하기 때문에 변수값을 초기화지 않음, 쓰레기값이 들어있음.
int Num=12;
int a, b;
int a, b=3, c, d;

3. printf

int value=12;
char ch='S';

printf("Value is %d, character is %c.\n", value, ch);
//첫 번째 문자열 인자 내에 %d나 %c같은 서식이 없으면, 이 인자 이후의 모든 파라미터를 생략할 수 있다.
  • 정수형
int Num=123;

printf("%d\n", Num);    // 결과 : 123
printf("%5d\n", Num);   // 결과 :   123
printf("%05d\n", Num);  // 결과 : 00123
printf("%-5d\n", Num);  // 결과 : "123  "
  • 실수형
double pie=3.14;

printf("%f\n", pie);        // 결과 : 3.140000  # %f 서식은 기본적으로 소수점 이하 여섯 자리까지 출력함
                           //                  # 또한 %f는 지정한 자리수에서 반올림 처리까지 한다.
printf("%10f\n", pie);      // 결과 :   3.140000  # 점을 포함한 10자리
printf("%.2f\n", pie);      // 결과 : 3.14
printf("%10,2f\n", pie);    // 결과 :       3.14
printf("%010.2f\n", pie);  // 결과 : 0000003.14
printf("%-10.2f\n", pie);   // 결과 : "3.13      "

4. scanf

  • scaf("서식문자열", &변수 [,& 변수, ...]);
int a, b;
double c;
int d, e;

scanf("%d", &a);
scanf("%d", &b);

scanf("%f", &c);

scanf("%d%d", &d, &e); // 입력은 숫자와 숫자 사이에 공백을 둔다.

5. 정수형

int i

정수형 타입

타입크기(바이트)범위
int4-2,147,483,648~2,147,483,647 (2312311-2^{31} \sim 2^{31}-1)
short2-32,768~32,767 (2152151-2^{15}\sim 2^{15}-1)
long4-2,147,483,648~2,147,483,647 (2312311-2^{31} \sim 2^{31}-1)
unsigned int40~4,294,967,295 (023210\sim 2^{32}-1)
unsigned short20~65,535 (021610\sim 2^{16}-1)
  • 참고
    • int와 long은 크기와 수를 표현할 수 있는 범위가 동일하게 보인다.
      • long은 어떤 플랫폼에서나 4바이트다.
      • int는 CPU가 가장 효율적으로 다룰 수 있는 정수형으로 정의되어 있다. 그래서 int형의 실제 크기는 플랫폼에 따라 달라진다.
        int형의 정의를 확인해보면 'CPU의 레지스터와 동일한 크기를 가지는 타입'이다.
        더 나아가서 포인터 값의 크기도 플랫폼에 따라 다르다.
  • 정수형 상수
    • 상수 값에 접미사를 붙여 값이 저장될 크기를 지정할수 있다.
      • short 타입으로 저장될 수 있는 값이지만 접미사 'L'을 붙여 long형 상수로 사용할 수 있다.
      • 접미사 'U'를 붙여 unsigned 상수로 사용할 수 있다.
      • 접미사 'UL'를 붙여 unsigned long형 상수로 사용할수 있다.
  • 값의 진법 표현
    • 8진수 : '접두사' 0을 붙인다. (ex. 017, 032)
    • 16진수 : '접두사' 0x를 붙인다. (ex. 0x12ab, 0x3f) (알파벳은 대소문자 구분하지 않음)
      • printf에서 %X 서식을 이용하면 16진수로 출력이된다.

6. 실수형

타입크기(바이트)범위유효자리수(십진)
float43.4×10383.4×10383.4 \times 10^{-38} \sim 3.4 \times 10^{38}7
double81.7×103081.7×103081.7 \times 10^{-308} \sim 1.7 \times 10^{308}15
long double10~161.2×1049321.2×1049321.2 \times 10^{-4932} \sim 1.2 \times 10^{4932}19
  • 실수형 상수
    • 단순히 소수점 값을 변수에 입력할 수도 있고, 1.23456e2 로 입력하여 대입할 수도 있다.
    • 접미사 F를 붙이면 float 상수다. 아무 접미사도 붙이지 않는다면 double 상수다.
    • (소수점 값에) 접마사 L을 붙이면 long double 상수다.
  • printf 실수형 서식
    • %f는 고정 소수점 표현 서식이다. (ex. 123.456000)
    • %e는 부동 소수점 표현 서식이다. (ex. 1.23456e+002)
    • %g는 일반 표현 서식이다. (ex. 123.456)
      • %g는 %f와 %e 중 더 짧고 간단한 방법을 자동을 선택함.

7. 문자형

문자

  • 문자 하나를 표현하는 자료형
  • 문자 인코딩 방식으로 아스키(ASCII) 코드 방식을 많이 사용한다.
    • 아스키 코드는 0~255 사이의 숫자에 문자를 대응 시켜 놓은 것.
    • 실제 아스키 코드는 0~127까지의 숫자에만 문자가 대응되어 있다.
  • char형 변수에 문자를 대입할 때는 따옴표로 한 문자만 묶어서 사용한다.
    • 또는 숫자값을 입력해도 된다.
  • printf 함수를 이용하여 char 변수를 표현할 때는 '%c'서식을 이용한다.
    • '%d'를 이용하면 해당 문자에 대응되는 숫자가 출력된다.
  • Escape Sequence (확장열) 참고.
타입크기(바이트)범위
char1-128~127 (27271-2^{7} \sim 2^{7}-1)
unsigned char10~255 (02810\sim 2^{8}-1)

문자열

  • 문자열은 일련의 문자가 연속되어 있는 것이다. 즉 문자의 집합이 곧 문자열이다.
  • 문자열 상수는 문자 상수와 달리 겹따옴표로 감싸서 표현한다.
    • 예를 들어 'S'는 S라는 문자 하나만을 표현하지만, "S"는 한 글자로만 된 문자열이다.
char str[6]="Korea";
  • 위 코드는 다음과 같이 공간이 할당되고 초기화가 된다.
    • 아래 그림처럼 각 격자는 1바이트의 문자들이며 각 격자에 문자 하나씩이 들어있다.
    • 제일 끝에 있는 \0은 여기가 문자열의 끝임을 알리는 역할을 하며 널 종료 문자라고 한다.
      메모리는 연속적인 공간이기 때문에 그 끝을 명확히 표시해야 한다.
    • 따라서 널 종료 문자까지 고려해서 배열의 크기를 지정해야 한다.
Korea\0
  • printf 함수를 이용하여 문자열을 출력하고자 할 때는 %s 서식을 이용해야한다.

8. 열거형

  • 변수가 가질 수 있는 가능한 값들을 나열해 놓은 타입.
  • enum {멤버, 멤버, ...} 변수;
enum {EAST, WEST, SOUTH, NORTH} mark;
// 이 경우 EAST는 0, WEST는 1, SOUTH는 2, NORTH는 3 이다.
enum {EAST=5, WEST=10, SOUTH, NORTH} mark;
// 이 경우 EAST는 5, WEST는 10, SOUTH는 11, NORTH는 12 이다.
enum {man=1, woman=2, girl=2} human;

//사용 예
mark=EAST;
if (mark == WEST){
    // ...
}
  • 태그
    • 열거형은 내부적으로 정수형으로 처리되지만 값의 범위가 엄격하게 정해지는 별도의 타입이다.
      그래서 열거형 타입을 먼저 정의하고 이 타입으로부터 변수를 선언하는 방법이 더 많이 사용된다.
      이때 열거형 타입에 대해 붙여지는 이름을 태그(tag)라고 하며 int, double과 마찬가지로 타입의 자격을 가진다.
    • enum 태그명 {멤버, 멤버, ...}
enum origin {EAST, WEST, SOUTH, NORTH};
enum origin mark; // C++ 문법에서는 선언시 enum 키워드를 사용하지 않아도 된다.
mark=WEST;

//

enum origin mark2, mark3;
void func(enum origin mark);

9. 유도형

  • 유도형은 기본형의 조합에 의해 만들어지는 타입들이며, 기본형 변수 여러 개를 모아서 또는 기본형을 약간 변형하여 만들어지는 타입들이다.

9.1. 배열

  • 타입 배열명[크기][크기]...;
int array[5];
double rate[10];
int  Score[3][10]
//...
printf("%d", array[3]);
  • 컴파일러는 배열 선언문을 만나면 요소의 크기만한 메모리를 개수만큼 연속적으로 할당한다.

9.2. 구조체

  • 동일한 타입의 집합인 배열과는 달리 구조체(Structure)는 서로 다른 타입의 집합이다.
  • 구조체에 속하는 개별 변수들을 멤버라고 한다.
  • 정수형 변수와 실수형, 문자형 등의 기본형 변수뿐만 아니라 배열이나 구조체 같은 큰 변수도 멤버가 될 수 있다.
  • struct { 멤버 목록 } 변수명;
struct {
	char Name[10];
    int Age;
    double Height;
} Friend;

Friend.Age=28;
//...
printf("%s", Friend.Name);
  • 공용체(Union)은 구조체와 유사하지만 멤버끼리 기억 공간을 공유한다는 점이 다르다.

9.3 포인터

  • 포인터 선언
    • 타입 *pi;
  • 변수에 저장된 값의 메모리 번지를 읽는 연산자는 '&'다.
  • 포인터가 가리키는 번지의 값을 읽는 연산자는 '*'이다.
int Num=629;
int *pi;

pi=&Num
prinf("%d", *pi); // 출력은 629

9.4 사용자 정의형

  • typedef 타입정의 타입이름;
typedef int jungsoo;
typedef enum {True, False} Bool;
typedef int *pint;
typedef int arint[10];
typedef struct {int a; doubleb;} myst;

9.5 논리형 (실제로는 반영되지 않음)

  • C 문법은 논리형을 별도의 기본형 타입으로 인정하지 않는데, 그래서 C 컴파일러들은 열거형이나 사용자 정의형으로 논리형 타입인 BOOL을 만들어서 사용한다. 아래 예시 참고.
typedef int BOOL;
#define TRUE 1
#define FALSE 0;
  • 참고
    • 논리형은 stdbool.h를 이용하여 사용할 수 있다.
#include <stdbool.h>

// ...

bool l_switch;
l_switch=true;
printf("%d\n",l_switch); // 출력 결과 : 1
l_switch=false;
printf("%d\n",l_switch); // 출력 결과 : 0

출처 : 혼자 연구하는 C/C++ 1 / 김상형 저 / 와우북스

profile
White book for everything I need.

0개의 댓글