← Lập trình C cơ bản

Bài 3 · Cơ bản · 16 phút· Cập nhật 11/06/2026

Làm quen với C

Biên soạn bởi Nguyễn Anh Tuấn

Viết hello.c, biên dịch thành file chạy được, chạy trong terminal, rồi đọc vài lỗi biên dịch cơ bản như thiếu ; hoặc thiếu }.

C là một trong những ngôn ngữ lập trình quan trọng và lâu đời nhất - nền tảng của Linux, nhiều hệ điều hành và cả các ngôn ngữ ra sau. Theo truyền thống, chương trình đầu tiên ai cũng viết là in ra dòng chữ Hello, World!. Bấm từng dòng để xem nó làm gì:

Bấm vào từng dòng để xem nó làm gì:

printf("Hello, World!\n");

In dòng chữ Hello, World! ra màn hình. \n nghĩa là “xuống dòng”. Dấu ; kết thúc câu lệnh - bắt buộc!

  • Mọi chương trình C bắt đầu chạy từ hàm main.
  • printf in chữ ra màn hình - cần header #include <stdio.h> ở đầu.
  • Mỗi câu lệnh kết thúc bằng dấu chấm phẩy “;”.

Khác Scratch hay Python trong cách chạy chương trình, C là ngôn ngữ biên dịch (compiled): bạn viết mã nguồn (file .c), rồi một chương trình tên trình biên dịch (compiler, vd gcc) dịch toàn bộ sang mã máy thành một file chạy được (executable). Sau đó bạn chạy file đó.

hello.c
mã nguồn (mèo con viết)
- cc → biên dịch -
hello
file chạy được (mã máy)
- ./hello → chạy -
Hello, World!
kết quả
  • Viết: lưu mã nguồn vào file hello.c.
  • Biên dịch: cc -std=c17 -Wall -Wextra -Wpedantic -g hello.c -o hello → tạo file chạy được tên “hello” (bộ cờ đồng hành từ bài Cài đặt môi trường).
  • Chạy: ./hello → in ra Hello, World!.
  • Biên dịch MỘT lần, chạy NHIỀU lần, thực thi rất nhanh vì đã biên dịch ra mã máy từ bước trên.

Mọi chương trình C đều có chung một bộ khung. Dưới đây là một ví dụ in ra hai dòng, để ý nó vẫn gồm #include, main(void), các câu lệnh kết thúc bằng “;”, và return 0;:

hello2.c

#include <stdio.h>

int main(void) {
    printf("Toi dang hoc C!\n");
    printf("That thu vi.\n");
    return 0;
}

Kết quả khi chạy

Toi dang hoc C!
That thu vi.
  • #include <...> ở đầu để đưa khai báo từ header vào mã nguồn.
  • int main(void) { ... } là thân chính của chương trình.
  • Mỗi statement kết thúc bằng “;” xuống dòng chỉ để code dễ đọc.
  • return 0; ở cuối báo chương trình chạy xong, 0 nghĩa là không có lỗi, khác 0 nghĩa có lỗi. Hệ điều hành có thể dùng số trả về này để biết chương trình chạy thành công hay thất bại.

Bạn có thể tìm kiếm thêm về standard exit codes trong các hệ điều hành phổ biến như Windows, MacOS, Linux.

Thông thường các bạn mới học lập trình C thường mắc phải một số lỗi cơ bản sau đây (đừng lo lắng, chỉ là vài lỗi vặt, không có gì kinh khủng đâu):

  • Thiếu dấu “;” ở cuối câu lệnh → lỗi biên dịch (hay gặp nhất).
  • Thiếu dấu “}” đóng hàm → lỗi “mong đợi }”.
  • Quên #include <stdio.h> → trình biên dịch không nhận ra printf.
  • Viết Main hoặc MAIN thay vì main → C phân biệt CHỮ HOA/thường.

Mẹo: đọc thông báo lỗi

Khi biên dịch lỗi, trình biên dịch sẽ chỉ rõ số dòng bị sai. Đừng hoảng, phần lớn lỗi lúc mới học chỉ là thiếu một dấu ; hay }. Đọc đúng dòng nó báo, sửa, rồi biên dịch lại. Bài kế tiếp C biên dịch như thế nào? sẽ cho bạn bộ khung để đọc mọi báo lỗi theo đúng bước.

Câu hỏi thường gặp

C là ngôn ngữ BIÊN DỊCH: mã nguồn được dịch trước ra mã máy thành một file chạy được, rồi hệ điều hành chạy file đó. Python/Scratch thường chạy qua runtime/interpreter khi bạn bấm chạy, tiện để học và thử nhanh, nhưng không tạo executable riêng theo cách C làm trong bài này.

Từ header chuẩn stdio.h (standard input/output). Dòng #include <stdio.h> đưa phần khai báo cần thiết vào mã nguồn, để compiler biết printf nhận tham số và trả về kiểu gì. Phần thư viện chuẩn được linker ghép ở bước sau.

Đó là một ký tự đặc biệt nghĩa “xuống dòng” (newline). Không có \n thì chữ in ra sẽ dính liền nhau. Tương tự, \t là một dấu tab.

Nên có. Số 0 trả về cho hệ điều hành nghĩa là “chương trình chạy xong, không lỗi”. Với main, chuẩn C cho phép bỏ (mặc định coi như trả 0), nhưng viết rõ ra là thói quen tốt.

Vì C dùng dấu chấm phẩy để biết một câu lệnh đã kết thúc - nó KHÔNG dựa vào việc xuống dòng như Python. Thiếu “;” là lỗi biên dịch hay gặp nhất khi mới học.

Được, nếu file lưu dạng UTF-8 và cửa sổ dòng lệnh hỗ trợ UTF-8. Nhưng lúc mới học nên dùng chữ KHÔNG dấu cho gọn (vd “Xin chao”) để tránh lỗi phông chữ làm rối.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Theo bài, ba bước để biến file hello.c thành dòng chữ hiện trên màn hình là gì?

  1. 1

    In tên của mèo con

    Sửa chương trình Hello World để in ra “Xin chao, <tên mèo con>!”.

    Hoàn thành khi: Dòng printf đổi thành vd printf("Xin chao, Tuan!\n"); - chạy ra đúng câu đó.

  2. 2

    In ba dòng

    Viết một chương trình in ra 3 dòng chữ bất kỳ, mỗi dòng một câu.

    Hoàn thành khi: 3 lệnh printf (hoặc 1 printf có 3 dấu \n), kết quả là 3 dòng riêng biệt.

  3. 3

    Tìm và sửa lỗi

    Một chương trình bị thiếu dấu “;” ngay sau lệnh printf nên không biên dịch được. Mèo con hãy chỉ ra và sửa.

    Hoàn thành khi: Thêm “;” vào cuối câu printf → chương trình biên dịch và chạy bình thường.

  4. 4

    Ba bước để chạy

    Viết lại 3 bước biến file hello.c thành dòng chữ hiện trên màn hình.

    Hoàn thành khi: 1) viết & lưu hello.c · 2) biên dịch: cc -std=c17 -Wall -Wextra -Wpedantic -g hello.c -o hello · 3) chạy: ./hello.

  5. 5

    Vì sao phải biên dịch lại?

    Giải thích bằng lời: vì sao sửa một chữ trong printf rồi phải BIÊN DỊCH LẠI mới thấy thay đổi?

    Hoàn thành khi: Vì file đang chạy là bản dịch CŨ; phải dịch lại mã nguồn để tạo file chạy mới có nội dung đã sửa.