Biến, định danh và kiểu dữ liệu trong C

Biến

Biến (variable) là một vùng trên bộ nhớ dùng để lưu tạm một giá trị nào đó để chương trình thao tác.

Lúc học toán, chúng ta thường đặt biến x, biến y,… để giải bài toán. Giả sử thầy giáo của bạn gọi bạn lên hỏi 3 + 2 bằng mấy, lúc đó, nếu phân tích chậm lại, quy trình mà đầu óc của bạn xử lý gồm:

  1. Đầu tiên bạn phải lắng nghe câu hỏi của thầy.
  2. Sau khi lắng nghe, bạn phải nhớ câu hỏi của thầy. Nếu nghe xong bạn quên ngay thì sẽ không thể tính toán rồi trả lời cho thầy được. Trường hợp này, bạn sẽ phải nhớ 3 thứ riêng biệt:
    1. Số 3
    2. Đang muốn làm phép + chứ không phải -, x hay :
    3. Số 2
  3. Sau đó, bạn tính nhẩm ra kết quả là 5. Lúc này, bạn có thể quên số 3, phép + và số 2. Bạn chỉ cần nhớ số 5 để trả lời cho thầy.
  4. Cuối cùng, sau khi trả lời cho thầy xong, bạn có thể quên luôn số 5.

Máy tính cũng xử lý giống quy trình trên. Mỗi khi bạn muốn chương trình lưu giữ một giá trị gì đó để tính toán, bạn phải khai báo biến. Trong chương trình C, phép + được gọi là một toán tử, ở mức của C, nó được thực hiện tự động khi bạn gọi và không cần phải ra lệnh C phải nhớ nó. Bạn chỉ cần khai báo các biến để nhớ số 3, số 2 và số 5.

Khi sử dụng biến, hệ thống sẽ tự động lấy một vùng nhớ nào đó để lưu giá trị cho nó. Chúng ta không quan tâm đến đó là vùng nhớ nào, chúng ta chỉ cần thao tác với giá trị đó thông qua tên biến.

Mỗi biến có tên, kiểu dữ liệu và giá trị mà biến lưu giữ.

Giả sử  bạn đặt x = 3, và y = 2, thì x, y là tên biến. Hai biến này đang lưu số nguyên, nên kiểu dữ liệu của x, y là số nguyên. Trên máy tính, bạn cần phải khai báo kiểu dữ liệu để máy tính biết nên dành bao nhiêu ô nhớ để lưu giá trị. Nếu bạn khai báo ít quá, sẽ không thể lưu giá trị lớn, ngược lại, nếu khai báo nhiều mà giá trị cần lưu nhỏ, có thể gây lãng phí bộ nhớ không cần thiết.

Như trong minh họa trên, bạn không cần phải nhớ mãi số 3, số 2 và số 5. Biến trong C cũng có một phạm vi nhớ nhất định cần cho xử lý lúc đó, hết xử lý có thể cho biến mất đi, việc này giúp giải phóng bộ nhớ, dành để lưu các biến khác. Những biến như vậy gọi là biến cục bộ (local variable). Biến cục bộ thường được khai báo, có hiệu lực và sử dụng bên trong một khối mã cụ thể (mỗi khối mã thường bắt đầu bằng { và kết thúc bằng }). Ngoài ra, cũng có trường hợp bạn cần khai báo biến có thể sử dụng trong toàn bộ chương trình, bất cứ khối mã nào dùng cũng được. Những biến này gọi là biến toàn cục (global variable).

Identifier

Tên biến, và bao gồm cả tên hàm,… được gọi chung là định danh (identifier). Bạn phải tuân thủ các quy tắc sau khi đặt tên cho định danh:

  • Trong cùng một khối mã, các biến không được trùng tên nhau. Tương tự, các hàm không được trùng tên nhau. Nhưng tên biến có thể trùng tên hàm.
  • Tên luôn chỉ chứa ký tự hoặc số và dấu _, không được chứa khoảng trắng và các ký tự đặc biệt khác
  • Tên không được bắt đầu bằng số
  • Tên có phân biệt kiểu chữ hoa thường
  • Tên không được trùng với từ khóa. Chuẩn ANSI C có 32 từ khóa sau, ngoài ra, tùy thuộc môi trường, có thể có thêm một số từ khóa khác ngoài chuẩn:
    auto
    break
    case
    char
    const
    continue
    default
    do
    double
    else
    enum
    extern
    float
    for
    goto
    if
    int
    long
    register
    return
    short
    signed
    sizeof
    static
    struct
    switch
    typedef
    union
    unsigned
    void
    volatile
    while
  • Tên hàm cũng không nên trùng với các hàm đã có trong thư viện chuẩn của C

Kiểu dữ liệu cơ bản

C có 5 kiểu dữ liệu cơ bản:

  • Ký tự (character): char
  • Số nguyên (integer): int
  • Số chấm động (floating-point): float
  • Số chấm động đôi (double floating-point): double
  • Không có giá trị (valueless): void

Ngoài ra, còn một số kiểu đặc biệt khác mà bài khác mình sẽ nói. Trong các kiểu trên:

  • void chỉ dùng để khai báo hàm, ý nói hàm không có giá trị trả về. Không dùng từ khóa này để khai báo biến, ngoại trừ biến con trỏ (pointer)
  • char thường dùng để lưu ký tự, nhưng nếu lưu số nguyên cũng không có vấn đề gì, vì nền tảng của nó là số nguyên
  • int dùng để lưu số nguyên
  • Nếu bạn muốn lưu số có dấu chấm thập phân, bạn sử dụng float hoặc double
  • Chuẩn C không quy định kích thước của kiểu dữ liệu, mà chỉ quy định kích thước nhỏ nhất của nó. Tùy thuộc vi xử lý và trình biên dịch, kích thước các kiểu dữ liệu có thể khác nhau (thường được xác định trong file header limits.h), nhưng thông thường:
    • char: 8 bit (1 byte)
    • int: bằng độ dài word của môi trường thực thi (DOS: 16 bit, các máy 32 bit và 64 bit: 32 bit)

Modifiers

Ngoại trừ void, chúng ta còn có thể sử dụng các từ khóa thuộc nhóm modifier sau để thay đổi ý nghĩa các kiểu dữ liệu cơ bản:

  • short: có thể sử dụng với int. short nghĩa là ngắn, tức là số nguyên ngắn, kích thước tối thiểu 16 bit
  • long: có thể sử dụng với int, double. VD: long int. long nghĩa là dài, kích thước tối thiểu 32 bit. Ngoài ra, từ phiên bản chuẩn ISO/IEC 9899:1999, bạn có thể sử dụng long long để chỉ định kích thước tối thiểu là 64 bit.
  • signed: có thể được sử dụng với char, int, short int, long int. signed nghĩa là có dấu, tức là trong các bit, sẽ lấy ra bit đầu tiên để ký hiệu cho dấu (âm hoặc dương). Mặc định, các kiểu dữ liệu nếu không ghi gì sẽ là có dấu, ngoại trừ char.
  • unsigned: có thể được sử dụng với char, int, short int, long int. unsigned nghĩa là không có dấu, tức không có bit nào được lấy ra để ký hiệu cho dấu âm hay dương.

Kích thước các kiểu dữ liệu

Ví dụ với kiểu char (tối thiểu 8 bit), nếu có dấu:

  • Bit đầu là dấu, thường quy ước 0 là dấu dương, 1 là dấu âm.
  • Giá trị nhỏ nhất có thể lưu là 1 0 0 0 0 0 0 0, tương đương -128 ở hệ thập phân
  • Giá trị lớn nhất có thể lưu là 0 1 1 1 1 1 1 1, tương đương 127 ở hệ thập phân

Vậy nếu là có dấu, giá trị kiểu char có thể lưu nằm trong khoảng từ -128 đến 127.

Nếu là không có dấu:

  • Giá trị nhỏ nhất có thể lưu là 0 0 0 0 0 0 0 0, tương đương 0 ở hệ thập phân
  • Giá trị lớn nhất có thể lưu là 1 1 1 1 1 1 1 1, tương đương 255 ở hệ thập phân

Vậy nếu không dấu, giá trị kiểu char có thể lưu nằm trong khoảng từ 0 đến 255

Sử dụng quy tắc trên, chúng ta có danh sách các kiểu, kích thước tương ứng, và phạm vi lưu của chúng như sau:

  • char: tối thiểu 8 bit, tùy thuộc vào trình biên dịch và môi trường thực thi, có thể có phạm vi giống signed char hoặc unsigned char.
  • signed char: kích thước như char. Nếu là 8 bit thì phạm vi từ -128 đến 127
  • unsigned char: kích thước như char. Nếu là 8 bit thì phạm vi từ 0 đến 255
  • intsigned int: số nguyên có dấu, kích thước tối thiểu 16 bit, phạm vi tối thiểu từ −32768 đến 32767
  • unsigned, unsigned int: số nguyên không dấu, kích thước tối thiểu 16 bit, phạm vi tối thiểu từ 0 đến 65535
  • shortshort intsigned shortsigned short int: số nguyên có dấu, kích thước tối thiểu 16 bit, phạm vi tối thiểu từ −32768 đến 32767
  • unsigned shortunsigned short int: số nguyên không dấu, kích thước tối thiểu 16 bit, phạm vi tối thiểu từ 0 đến 65535
  • longlong intsigned longsigned long int: số nguyên dài có dấu, kích thước tối thiểu 32 bit, phạm vi tối thiểu từ −2147483648 đến 2147483647
  • unsigned longunsigned long int: số nguyên dài không dấu, kích thước tối thiểu 32 bit, phạm vi tối thiểu từ 0 đến 4294967295
  • long longlong long intsigned long longsigned long long int: số nguyên có dấu dài tối thiểu 64 bit, phạm vi từ –9223372036854775808 to 9223372036854775807
  • unsigned long longunsigned long long int: giống long long nhưng không dấu, phạm vi từ 0 đến 18446744073709551615
  • float: số chấm động có dấu, kích thước 32 bit
  • double: số chấm động có dấu, kích thước 64 bit
  • long double: số chấm động có dấu, kích thước có thể bằng doule, thường trên các máy x86 là 80 bit, có thể hơn tùy thuộc kiến trúc máy tính

Khai báo biến

Biến phải được khai báo trước khi sử dụng. Để khai báo biến, sử dụng cú pháp sau:

kiểu-dữ-liệu tên-biến;

hoặc:

kiểu-dữ-liệu tên-biến = giá-trị-ban-đầu;

Ví dụ:

int a; // khai báo biến a kiểu int

int b = 5; // khai báo biến b kiểu int và khởi tạo giá trị 5

unsigned int c = 10; // khai báo biến c kiểu int không dấu và khởi tạo giá trị 10

float d, e, f; // khai báo 3 biến d, e, f kiểu float

Vị trí khái báo biến:

  • Trong một hàm hay khối mã, gọi là biến cục bộ (local variable)
  • Trong phần định nghĩa tham số hàm, gọi là tham số hình thức (formal parameter)
  • Bên ngoài tất cả các hàm, gọi là biến toàn cục (global variable)

Nguồn tham khảo:

Tags:

Bình luận

Bình luận Facebook

lời bình luận