2009-05-11 58 views
15

Tôi vừa chạy vào một số mã sử dụng dấu chấm phẩy hoặc sử dụng dấu chấm phẩy cho các mục đích khác nhau mà tôi không biết.Dấu chấm phẩy ở cuối các câu lệnh if và các hàm trong C

Tôi đã tìm thấy dấu chấm phẩy ở cuối câu lệnh if và ở cuối hàm. Ví dụ:

int main (int argc, char * argv[]) { 
    // some code 

    if (x == NULL) { 
     // some code 
    }; <----- 

    // more code 

    return 0; 
}; <--- 

Nó được biên dịch bằng cc chứ không phải gcc. Các dấu chấm phẩy đó làm gì? Tôi giả định rằng không có sự khác biệt bởi vì trình biên dịch sẽ chỉ xem xét nó như là câu lệnh trống.

+2

Dấu chấm phẩy sau khi kết thúc hàm là sai. Nếu 'cc' chấp nhận nó, nó phải coi nó như là một loại khai báo toàn cầu trống rỗng - nhưng nó là không có thật. Bán kết khác đã được giải thích tốt. –

+0

'gcc' sẽ cảnh báo về dấu chấm phẩy ở cuối nếu bạn sử dụng cờ '-pantic'. 'cc' phụ thuộc vào nền tảng của bạn nhưng nó thường chỉ là một liên kết mềm với 'gcc' để bạn có thể thử nó hoặc xem 'man cc'. –

Trả lời

30

Chúng không làm gì cả. Đó là dấu hiệu của một người không hiểu ngôn ngữ một cách khủng khiếp, tôi nghi ngờ.

Nếu đây là mã nguồn bạn nghi ngờ "sở hữu", tôi sẽ xóa mã và cố gắng trò chuyện nhẹ nhàng với người đã viết mã đó.

+5

Chúng tôi đã từng thấy điều này khá nhiều năm trước khi chúng tôi có một nhóm lập trình viên chuyển từ Turbo Pascal sang C. Trong Pascal, bạn cần dấu chấm phẩy sau 'End' trong hầu hết các trường hợp, và các lập trình viên không chính xác mang bán -colon với họ. Một khi các hình thức thói quen, nó dính. –

7

đó là định dạng giả. Bạn lấy mẫu giống hệt với

if (x == NULL) { 
// some code 
do_something_here(); 
} 

/* empty (dummy statement) here */ ; 

// more code 
some_other_code_here(); 
+0

Bạn đã đưa ra một ví dụ tốt hơn bạn nghĩ. "// một số mã" phải là "// trống ở đây" vì nó trống và vì 0 câu lệnh giả có giá trị pháp lý như 1 câu lệnh giả. –

+0

Tôi đang làm theo ví dụ của mình, đó là lý do tại sao có "một số mã" - anh ta phải có một cái gì đó trong mã thực sự của mình. – Francis

5

Bạn nói đúng, trình biên dịch xem xét các câu lệnh trống. Họ không cần thiết, tôi đoán các lập trình viên bằng cách nào đó nghĩ rằng họ đã được.

1

Những dấu chấm phẩy này không cần thiết (như bạn đã nói, chúng là các câu lệnh trống). Mã của bạn biên dịch với gcc, với điều kiện 'x' được xác định (hãy kiểm tra http://www.codepad.org). Không có lý do tại sao một trình biên dịch C sẽ từ chối biên dịch mã của bạn.

2

Dấu chấm phẩy đầu tiên (sau câu lệnh if) chỉ là một biểu thức trống không làm gì cả. Tôi không thấy bất kỳ điểm nào có nó ở đó.

Dấu chấm phẩy thứ hai (sau hàm) là lỗi vì nó nằm ngoài bất kỳ khối mã nào. Trình biên dịch sẽ đưa ra một cảnh báo.

+0

Không. Không có cảnh báo với cc. Đó là lý do tại sao tôi nghĩ đoạn mã này là kỳ quái. Có lẽ nếu tôi chạy điều này thông qua lint, nó sẽ ném lỗi/cảnh báo. – codingbear

+0

Tôi nghĩ tiêu chuẩn C cho phép khai báo bên ngoài không có nội dung. Nói cách khác, kỳ lạ nhưng hợp pháp kỳ quái. Có lẽ tôi nên kiểm tra lại. –

+0

Trình lập trình Windows, là C++ cho phép dấu chấm phẩy tùy chọn sau khi định nghĩa hàm thành viên. Nhưng cả C và C++ đều không cho phép chúng xuất hiện sau định nghĩa hàm bình thường, theo kiến ​​thức của tôi –

0

Tôi nghĩ rằng tác giả có thể đã được đi cho một cái gì đó như:

if(condition for tbd block) 
    ; 
else { 
    //Some code here 
} 

mà bạn có thể làm gì nếu bạn bị giàn giáo mã và vẫn muốn có nó để biên dịch. Có một cơ hội tốt mà nó chỉ là một lỗi như Jon gợi ý mặc dù.

0

Những dấu chấm phẩy này vô dụng như những người khác đã chỉ ra rồi. Điều duy nhất tôi muốn thêm là IMO, chúng được tối ưu hóa, ví dụ, trình biên dịch không tạo ra bất kỳ mã thực nào cho chúng.

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