2011-11-16 34 views
7

Tôi chỉ chạy vào đoạn mã này mà thực hiện điều này:Cú pháp C/C++ - Tách các câu lệnh bằng, thay vì; hợp pháp?

delete a, a = 0; 

Nó biên dịch và chạy tốt. Nhưng không phải là điều này phải là:

delete a; 
a = 0; 

Tại sao phải tách các câu lệnh sử dụng, được cho phép trong trường hợp này?

Xin cảm ơn :)

+3

Nó được gọi là toán tử dấu phẩy: http://www.cplusplus.com/doc/tutorial/operators/. –

+2

Đó phải là câu trả lời, không phải là một bình luận. – Mysticial

+0

Tất nhiên, ví dụ ở đây là C++, không phải C. :-) – ibid

Trả lời

6

Đây là toán tử dấu phẩy. Nó đánh giá cả hai đối số của nó và trả về giá trị thứ hai.

+0

@Mankarse: Đã sửa, cảm ơn. –

5

Đây là toán tử dấu phẩy. Nó có thể được sử dụng để phân tách các biểu thức, chứ không phải khai báo.

+0

Bạn có thể giới thiệu nhiều khai báo cùng loại với dấu phẩy. –

7

Trong C và C++, hầu hết "báo cáo" thực sự là biểu thức. Dấu chấm phẩy được thêm vào một biểu thức làm cho nó thành một câu lệnh. Ngoài ra, nó được cho phép (nhưng hầu như luôn là kiểu xấu) để tách các biểu thức bên có hiệu lực bằng toán tử dấu phẩy: biểu thức bên trái được đánh giá cho các tác dụng phụ của nó (và giá trị của nó bị loại bỏ), và tay phải biểu thức bên cạnh được đánh giá cho giá trị của nó.

5

Đó là comma operator. Bài viết MSDN là here. Và hãy xem câu hỏi this để hiểu cách hoạt động của nó.

1

Trong khi có thể viết mã như vậy, nó có thể hơi lạ. Một usecase hơi thực tế hơn sẽ là nếu bạn có một struct T như sau:

struct T { 
    bool check() const; 
    void fix(); 
}; 

Bây giờ bạn muốn để lặp qua tất cả mọi thứ trong struct và chạy kiểm tra trên đó, và sau đó gọi sửa chữa nếu séc trả về false. Cách đơn giản để thực hiện việc này là

for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it) 
    if (!it->check()) 
     it->fix(); 

Giả sử bạn muốn viết nó một cách ngắn nhất có thể. fix() trả lại khoảng trống có nghĩa là bạn không thể chỉ cần đặt nó trong điều kiện. Tuy nhiên, sử dụng toán tử dấu phẩy bạn có thể làm được việc này:

for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it); 

tôi sẽ không sử dụng nó mà không có một lý do đặc biệt tốt, nhưng nó không cho phép bạn gọi bất kỳ chức năng từ một điều kiện, có thể được thuận tiện.

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