툴곰코드 노트C언어 › C언어 변수와 자료형

C언어 변수와 자료형

C는 변수를 만들 때 자료형을 먼저 적습니다. 그 정한 형이 계산 결과까지 바꿔 놓기 때문에, 형을 아는 것이 곧 결과를 아는 것입니다.

⬇ 예제 파일 받기 (.c)
C언어 · 회원가입 없음
내려받아 gcc 파일이름.c -o 실행파일 -Wall 로 컴파일한 뒤 실행합니다.
광고 영역

무엇을 하는 것인가

파이썬은 값을 넣으면 형이 알아서 정해집니다. C는 int 나이;처럼 형을 먼저 적어야 변수가 생깁니다. 번거로워 보이지만, 그 덕에 C는 값이 메모리에서 몇 바이트를 차지하는지 미리 압니다.

기본만 알면 됩니다. 정수 int, 실수 double, 문자 하나 char입니다. float도 실수지만 정밀도가 낮아서, 특별한 이유가 없으면 double을 쓰는 편이 안전합니다.

C에서 가장 자주 당하는 함정이 정수 나눗셈입니다. 5 / 22.5가 아니라 2입니다. 둘 다 정수라 결과도 정수로 잘라 버립니다. 실수 결과가 필요하면 5.0 / 2처럼 한쪽을 실수로 만들거나 (double)로 바꿔야 합니다.

입력은 scanf로 받습니다. 여기서 두 번째 함정이 나옵니다. scanf의 변수 앞에는 &를 붙여야 합니다. "이 변수가 있는 자리에 값을 넣어라"라는 뜻인데, 빠뜨리면 컴파일은 되고 실행할 때 프로그램이 죽습니다.

예제 코드

아래 코드가 위 버튼으로 받는 파일과 같은 내용입니다. 통째로 복사해 실행해 보고, 값을 바꿔 가며 결과가 어떻게 달라지는지 보는 편이 읽기만 하는 것보다 훨씬 빨리 익습니다.

/* 변수와 자료형 — 형을 먼저 정한다는 것의 뜻
   컴파일:  gcc c-variable.c -o var -Wall                */

#include <stdio.h>

int main(void)
{
    /* 만들 때 바로 값을 넣어 둡니다. 안 그러면 쓰레기 값이 들어 있습니다. */
    int    나이 = 20;
    double 키   = 168.5;
    char   등급 = 'A';       /* 문자 하나는 작은따옴표 */

    printf("%d살 / %.1fcm / %c등급\n", 나이, 키, 등급);
    printf("int 는 %zu 바이트, double 은 %zu 바이트\n",
           sizeof(int), sizeof(double));

    /* ── 여기가 C 에서 제일 많이 당하는 곳 ── */
    int 합계 = 5, 개수 = 2;

    printf("정수끼리 나누면: %d\n", 합계 / 개수);            /* 2   잘립니다 */
    printf("나머지:          %d\n", 합계 % 개수);            /* 1 */
    printf("한쪽을 실수로:   %.2f\n", 5.0 / 개수);            /* 2.50 */
    printf("형변환으로:      %.2f\n", (double)합계 / 개수);   /* 2.50 */

    /* 오버플로 — int 범위를 넘으면 조용히 엉뚱한 값이 됩니다 */
    int 큰수 = 2147483647;
    printf("int 최대에 1 더하면: %d\n", 큰수 + 1);   /* 음수가 됩니다 */

    long long 아주큰수 = 9000000000LL;
    printf("long long 이면: %lld\n", 아주큰수);

    /* ── 입력 받기: 변수 앞의 & 를 빼먹으면 실행 중에 죽습니다 ── */
    int 점수 = 0;
    printf("점수를 입력하세요: ");
    if (scanf("%d", &점수) == 1) {          /* 읽은 개수를 확인하는 습관 */
        printf("입력한 점수: %d\n", 점수);
        printf("10점 만점 환산: %.1f\n", 점수 / 10.0);
    } else {
        printf("숫자가 아닙니다.\n");
    }

    return 0;
}

기억할 것

광고 영역

자주 묻는 것

평균을 냈는데 소수점이 안 나옵니다

정수끼리 나눠서 그렇습니다. 합계 / 개수가 둘 다 int면 결과도 정수로 잘립니다. (double)합계 / 개수처럼 한쪽을 실수로 바꾸세요.

scanf 를 썼더니 프로그램이 그냥 죽습니다

&를 빠뜨렸을 가능성이 가장 큽니다. scanf("%d", 나이)가 아니라 scanf("%d", &나이)입니다. 다만 문자열(char 배열)에는 &를 붙이지 않습니다 — 배열 이름 자체가 이미 주소이기 때문입니다.

int 는 얼마까지 담기나요

보통 약 -21억 ~ +21억입니다. 넘어가면 조용히 엉뚱한 값이 됩니다(오버플로). 더 큰 수는 long long을 쓰고 %lld로 출력하세요.

float 과 double 중 뭘 쓰나요

특별한 이유가 없으면 double입니다. float은 유효숫자가 7자리쯤이라 계산을 몇 번만 거쳐도 오차가 눈에 띕니다. printf에서는 둘 다 %f로 출력하지만 scanffloat%f, double%lf로 다릅니다.

이어서 볼 글