2009-07-07 49 views
7

Tôi có một câu hỏi đơn giản mà tôi đang đặt ra chủ yếu cho sự tò mò của tôi.Hiệu suất khác biệt trong điều kiện vòng lặp?

Sự khác nhau giữa hai dòng mã này là gì? (Trong C++)

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

Việc lựa chọn các điều kiện là hoàn toàn tùy ý, tôi chỉ quan tâm đến sự khác nhau giữa, và & &.

Tôi không phải là người mới bắt đầu viết mã bằng bất kỳ phương tiện nào, nhưng tôi chưa bao giờ làm phiền với toán tử dấu phẩy.

Có sự khác biệt về hiệu suất/hành vi hoặc nó hoàn toàn có tính thẩm mỹ không?

Một lưu ý cuối cùng, tôi biết có cá hiệu suất lớn hơn để chiên hơn một toán tử có điều kiện, nhưng tôi chỉ tò mò. Thưởng thức tôi.

Chỉnh sửa Cảm ơn câu trả lời của bạn.

Hóa ra mã nhắc câu hỏi này đã lạm dụng toán tử dấu phẩy theo cách tôi đã mô tả. Tôi tự hỏi sự khác biệt là gì và tại sao nó không phải là một toán tử & &, nhưng nó chỉ được viết không chính xác. Tôi không nghĩ có gì sai vì nó hoạt động tốt. Cảm ơn đã thẳng thắn với tôi.

+0

Tại sao bạn lo lắng về hiệu suất? Trong thời gian cần thiết để có được câu trả lời cho câu hỏi này, 9 nano giây bạn đã lưu bằng cách sử dụng một hoặc ký pháp khác đã bị mất. "Tối ưu hóa sớm là gốc rễ của tất cả các điều ác ..." – Juliet

+17

Ông không nói rằng ông đã lo lắng - chỉ tò mò. Tôi thực sự muốn mọi người sẽ ngừng vẫy cờ "tối ưu hóa sớm" mỗi khi có ai đó "chỉ muốn biết". Tò mò là một điều tốt đẹp *. –

+5

Tôi tự hỏi bao nhiêu thời gian sẽ được lưu nếu SO thực hiện một bộ lọc, mỗi khi có ai đề cập đến từ "hiệu suất" hoặc "nhanh hơn" trong một câu hỏi, chỉ cần tự động đăng bình luận, "bạn không được phép nghĩ về rằng, công dân, bây giờ trở lại làm việc ";-) –

Trả lời

10

Mặc dù có vẻ như nó,

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

không tương đương.

Dưới đây là bằng chứng.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    int val = (N, i); 
    cout << val << endl; 
} 

Kết quả:

5 

Điều đó có nghĩa rằng khi xác định khi vòng lặp sẽ thoát khỏi nó sẽ sử dụng N > 0. Nếu N = 10, điều này có nghĩa là nó sẽ luôn đúng và vòng lặp sẽ không bao giờ thoát.

Chạy ứng dụng này và xem bằng chứng.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    for(int i = 0; i < N, N > 0; i++){ 
    cout << val << endl; 
    } 
} 

bash-2.05$ ./a.out     
0         
1         
2         
3         
4         
5         
6         
7         
8         
9         
10         
11         
... 
142 
143 
144 
145 
146 
147 
148 
^C 

Nếu N là một hằng số hoặc biến mà không làm thay đổi bên trong vòng lặp sau đó bạn chỉ có thể loại bỏ việc kiểm tra N > 0 bằng cách kiểm tra nó một lần đầu tiên, ví dụ:

if (N > 0){ 
    for (int i = 0; i < N; i++) 
    ... 
} 
+0

Tôi không biết tại sao không ai bỏ phiếu này. Tôi thích một câu trả lời và suy nghĩ chi tiết khi tôi yêu cầu giải thích. Cảm ơn – CodeFusionMobile

+3

Tôi sẽ không bỏ phiếu vì nó không nêu rõ sự khác biệt và cố gắng xác định ý nghĩa bằng thử nghiệm, thay vì xem xét tiêu chuẩn hoặc bất kỳ tài liệu nào. –

+0

Tôi thích các ví dụ và thử nghiệm cá nhân. Câu trả lời của RichieHindle ngắn gọn và chính xác, nhưng không phải là rất mô tả và cũng không trả lời câu hỏi của tôi sự khác biệt thực sự là gì. Ngay cả khi câu trả lời này không nêu chi tiết lý do đằng sau vấn đề, nó đã thực sự trả lời câu hỏi. – CodeFusionMobile

33

Sử dụng dấu phẩy như vậy sẽ chỉ đơn giản là loại bỏ điều kiện đầu tiên.

Toán tử dấu phẩy có nghĩa là "chạy các câu lệnh này theo thứ tự này và lấy giá trị của câu lệnh cuối cùng".

+0

như trong nó hoàn toàn bỏ qua nó và không thực hiện kiểm tra? – Victor

+2

Giá trị của "' i < N, N > 0' "giống với giá trị của" 'N> 0'". – ephemient

+1

@Victor: Nó so sánh i và N, loại bỏ kết quả, sau đó so sánh N và 0 và sử dụng kết quả để quyết định có tiếp tục vòng lặp hay không. Trong mã tối ưu hóa, nó có thể sẽ không bận tâm để so sánh i và N. – RichieHindle

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