"K & R C" dùng để chỉ ngôn ngữ được xác định bằng ấn bản đầu tiên năm 1978 của Kernighan & Sách của Ritchie "Ngôn ngữ lập trình C".
Trong K & R (tức là, pre-ANSI) C, các thực thể thường có thể được khai báo mà không có loại rõ ràng và sẽ mặc định là loại int
. Điều này trở lại ngôn ngữ tổ tiên của C, B và BCPL.
main(a,b,c,d){
printf("%d", d);
}
Đó là gần tương đương với:
int main(int a, int b, int c, int d) {
printf("%d", d);
}
Cú pháp cũ vẫn hợp pháp nhưng nưa trong ANSI C (1989) và ISO C (1990), nhưng tiêu chuẩn 1999 ISO C bỏ " quy tắc int "ngầm định (trong khi vẫn giữ cú pháp khai báo và định nghĩa kiểu cũ).
Lưu ý rằng tôi đã nói số đó là gần tương đương. Về cơ bản nó giống nhau khi được xem như một định nghĩa, nhưng như một tuyên bố nó không cung cấp thông tin kiểu tham số. Với định nghĩa kiểu cũ, một cuộc gọi với số sai hoặc các loại đối số không cần được chẩn đoán; nó chỉ là hành vi không xác định. Với một nguyên mẫu có thể nhìn thấy, các đối số không khớp sẽ kích hoạt một chẩn đoán thời gian biên dịch - và, khi có thể, các đối số được chuyển đổi hoàn toàn thành kiểu tham số.
Và vì đây là định nghĩa của main
, có một vấn đề khác. Tiêu chuẩn chỉ chỉ định hai biểu mẫu cho main
(một đối tượng không có đối số và một biểu mẫu có hai đối số, argc
và argv
). Việc triển khai có thể hỗ trợ các biểu mẫu khác, nhưng một với bốn đối số int
không thể là một trong số chúng. Do đó, hành vi của chương trình không được xác định. Trong thực tế, có khả năng là d
sẽ có một số giá trị rác trên cuộc gọi ban đầu.(Và có, một cuộc gọi đệ quy để main
được phép trong C, nhưng hầu như không bao giờ là một ý tưởng tốt.)
foo(a,b){
a = 2;
b = 'z';
}
này gần như tương đương với:
int foo(int a, int b) {
a = 2;
b = 'z';
}
(Và lưu ý rằng 'z'
là loại int
, không loại char
)
Và một lần nữa, hình thức cũ không cung cấp cho bạn kiểm tra kiểu tham số, do đó, một cuộc gọi như:.
foo("wrong type and number of arguments", 1.5, &foo);
không cần chẩn đoán.
Điểm mấu chốt: Thật hữu ích khi biết K & các khai báo và định nghĩa hàm kiểu R hoạt động như thế nào. Vẫn còn mã cũ sử dụng chúng, và chúng vẫn còn hợp pháp (nhưng đã lỗi thời) ngay cả trong C2011 (mặc dù không có quy tắc "int ngầm"). Nhưng có rất gần như không có lý do tốt để viết mã sử dụng chúng (trừ khi bạn đang mắc kẹt bằng cách sử dụng một trình biên dịch rất cũ, nhưng đó là hiếm và trở nên hiếm hơn.)
Nhưng tôi có thể đảm bảo với bạn, tôi sẽ không sử dụng cú pháp như vậy trong lập trình C.
Tuyệt vời!
Cảnh báo bạn đang nhận được là gì? Sẽ rất có ích khi cố gắng trả lời câu hỏi của bạn. – Glenn
@Glenn xin lỗi không có cảnh báo nào liên quan đến loại tiền thưởng – P0W
: Hãy thử gọi 'foo (" this "," should "," work ")'. – nneonneo