2012-05-26 42 views
10

thể trùng lặp:
C function syntax, parameter types declared after parameter listChức năng định nghĩa C

tôi thấy cú pháp sau đây để định nghĩa hàm trong "Expert C Programming"

int compare(s1, s2) 
    char * s1, *s2; 
{ 
    while (*s1++ == *s2) { 
     if (*s2++ == 0) return (0); 
    } 
    return (*--s1 - *s2); 
} 

Làm thế nào là định nghĩa trên hợp lệ? Nó biên dịch và chạy hoàn hảo mà không có bất kỳ lỗi nào.

Tôi cảm thấy thoải mái hơn với cú pháp sau đây để định nghĩa hàm

int compare(char * s1,char *s2) 
{ 
    while (*s1++ == *s2) { 
     if (*s2++ == 0) return (0); 
    } 
    return (*--s1 - *s2); 
} 

và không có nơi tôi đã nhìn thấy một trong những trình bày trong cuốn sách (Trong thời gian học ở trường đại học C của tôi hay ở nơi khác), có thể bất cứ ai hãy ném một số ánh sáng trên một cái được đưa ra trong cuốn sách.

+5

Đó là cú pháp cũ và không dùng nữa cho khai báo hàm. Đôi khi được gọi là "phong cách K & R". – cnicutar

+3

Đây là kiểu cũ nhưng vẫn được ngôn ngữ chấp nhận. BTW: Tôi không nghĩ rằng một cuốn sách "lập trình C chuyên gia" nên chứa 'return (0);' – wildplasser

+0

20 năm trước, các trình biên dịch không thể xử lý cú pháp * giây * vẫn khá phổ biến. – Amadan

Trả lời

6

Chủ đề này đã được thảo luận here trước đây, đó là "kiểu Kernighan và Ritchie" của định nghĩa hàm.

Ngày nay bạn nên chọn cú pháp thứ hai, cú pháp đầu tiên vẫn được chấp nhận bởi một số trình biên dịch vì lý do tương thích ngược nhưng cần được xem là không được dùng cho mọi mục đích thực tế.

+1

Cảm ơn câu trả lời và xin lỗi nếu một số người dùng nghĩ rằng đó là một bản sao .. Trong phòng thủ của tôi, tôi không bao giờ biết có một cú pháp kiểu K & R cho C, tôi luôn thấy ANSI C, thậm chí các chương trình trên internet có cú pháp tương tự như ANSI C ... Vì vậy, điều đầu tiên mà đi vào tâm trí của tôi là một cuốn sách typo và câu hỏi của tôi thực sự là làm thế nào điều này vẫn có thể làm việc.Cảm ơn bạn. –

+1

@Kartik Không cần phải xin lỗi! Có vẻ như câu hỏi này sẽ bị đóng như một bản sao của câu hỏi đó, nhưng điều đó không nên bị coi là xúc phạm. Nó không có nghĩa là bạn đã hỏi một câu hỏi hay bất cứ điều gì. Không thể biết rằng phong cách K & R đã tồn tại; đó là những gì chúng tôi đang ở đây! –

+0

@CodyGray Cảm ơn –

3

Đây là cú pháp pre-ANSI, đôi khi được gọi là K&R C. Đó là cú pháp ban đầu của ngôn ngữ C.

Các vấn đề liên quan