Lỗi cú pháp và lỗi ngữ nghĩa khác nhau như thế nào

Cú pháp là về cấu trúc hoặc ngữ pháp của ngôn ngữ. Nó trả lời câu hỏi: làm thế nào để tôi xây dựng một câu hợp lệ? Tất cả các ngôn ngữ, thậm chí tiếng Anh và các ngôn ngữ khác của con người [còn gọi là ngôn ngữ "tự nhiên"] đều có ngữ pháp, nghĩa là các quy tắc xác định liệu câu đó có được xây dựng đúng hay không.

Dưới đây là một số quy tắc cú pháp ngôn ngữ C:

  • báo cáo riêng biệt với một dấu chấm phẩy
  • kèm theo biểu thức điều kiện của câu lệnh IF bên trong dấu ngoặc đơn
  • nhóm nhiều câu lệnh thành một câu lệnh bằng cách đặt trong dấu ngoặc nhọn
  • các kiểu dữ liệu và biến phải được khai báo trước câu lệnh thực thi đầu tiên [tính năng này đã bị loại bỏ trong C99. C99 và sau đó cho phép khai báo kiểu hỗn hợp.]

Ngữ nghĩa là về nghĩa của câu. Nó trả lời các câu hỏi: câu này có hợp lệ không? Nếu vậy, câu có nghĩa là gì? Ví dụ:

x++; // increment foo[xyz, --b, &qrs]; // call foo

là các câu lệnh C có giá trị cú pháp. Nhưng họ muốn nói gì? Thậm chí có hợp lệ để cố gắng chuyển đổi các câu lệnh này thành một chuỗi các hướng dẫn thực thi không? Những câu hỏi này là trung tâm của ngữ nghĩa.

Hãy xem xét toán tử ++ trong câu lệnh đầu tiên. Trước hết, nó có hợp lệ để thử cái này không?

  • Nếu x là kiểu dữ liệu float, câu lệnh này không có nghĩa [theo quy tắc ngôn ngữ C] và do đó, nó là một lỗi mặc dù câu lệnh đúng về mặt cú pháp.
  • Nếu x là con trỏ tới một số loại dữ liệ, ý nghĩa của câu lệnh là "thêm sizeof [một số loại dữ liệ] vào giá trị tại địa chỉ x và lưu kết quả vào vị trí tại địa chỉ x ".
  • Nếu x là một vô hướng, ý nghĩa của câu lệnh là "thêm một vào giá trị tại địa chỉ x và lưu kết quả vào vị trí tại địa chỉ x".

Cuối cùng, lưu ý rằng một số ngữ nghĩa không thể được xác định tại thời gian biên dịch và do đó phải được đánh giá tại thời gian chạy. Trong ví dụ về toán tử ++, nếu x đã ở giá trị tối đa cho kiểu dữ liệu của nó, điều gì xảy ra khi bạn cố gắng thêm 1 vào nó? Một ví dụ khác: điều gì xảy ra nếu chương trình của bạn cố gắng xóa bỏ một con trỏ có giá trị là NULL?

Tóm lại, cú pháp là khái niệm chỉ liên quan đến việc câu đó có hợp lệ đối với ngữ pháp của ngôn ngữ hay không. Ngữ nghĩa là về việc câu có ý nghĩa hợp lệ hay không.

Video liên quan

Chủ Đề