Xin lỗi nếu câu hỏi này là ngây thơ. Hãy xem xét chương trình sau:
#include <stdio.h>
int main() {
int i = 1;
i = i + 2;
5;
i;
printf("i: %d\n", i);
}
Trong ví dụ trên, các câu lệnh 5;
và i;
dường như hoàn toàn thừa, tuy nhiên mã sẽ biên dịch mà không có cảnh báo hoặc lỗi theo mặc định (tuy nhiên, gcc không đưa ra warning: statement with no effect [-Wunused-value]
cảnh báo khi chạy với -Wall
). Chúng không có tác dụng đối với phần còn lại của chương trình, vậy tại sao chúng được coi là tuyên bố hợp lệ ngay từ đầu? Có trình biên dịch đơn giản bỏ qua chúng? Có bất kỳ lợi ích để cho phép tuyên bố như vậy?
;
sau nó. Nó sẽ làm phức tạp ngôn ngữ để thêm nhiều quy tắc về thời điểm biểu thức không thể là câu lệnh
printf()
? Báo cáo kết quả 5;
về cơ bản nói "làm bất cứ điều gì 5
không (không có gì) và bỏ qua kết quả. Tuyên bố của bạn printf(...)
là 'làm bất cứ điều gì printf(...)
không và bỏ qua những kết quả (giá trị trả về từ printf()
)'. C đối xử với những người như vậy. Điều này cũng cho phép mã như (void) i;
nơi i
là một tham số cho một chức năng mà bạn sử dụng void
để đánh dấu nó là không được sử dụng một cách có chủ ý.
printf()
có ảnh hưởng, ngay cả khi bạn bỏ qua giá trị mà cuối cùng nó trả về. Ngược lại 5;
không có tác dụng gì cả.