2010-08-21 65 views

Trả lời

7

Chúng tương đương ngữ nghĩa. (x;y;z) { foo; } tương đương với x; while (y) { foo; z; }. Chúng không chính xác tương đương trong các phiên bản tiêu chuẩn khác, trong ví dụ của for (int x = 0; y; z), phạm vi của x là khối và nằm ngoài phạm vi sau khi kết thúc vòng lặp, trong khi với int x; while (y) x nó vẫn nằm trong phạm vi sau khi kết thúc vòng lặp.

Một khác biệt khác là for diễn giải thiếu y là TRUE, trong khi while phải được cung cấp kèm theo một biểu thức. for (;;) { foo; } là tốt, nhưng while() { foo; } thì không.

+1

FYI, câu hỏi là hỏi về vòng lặp vô hạn, không phải ngữ nghĩa của cho vs trong khi nói chung. –

+3

Nếu bạn muốn đi quanh địa phương của câu lệnh 'x', bạn có thể nói' for (x; y; z) {foo; } 'tương đương với' {x; trong khi (y) {foo; z; }} '. –

+0

Đối với ngữ nghĩa, chuẩn ngôn ngữ C cho các vòng lặp cho phép một cấu trúc cho một vòng lặp giống hệt với vòng lặp while. Tuy nhiên, điều này mâu thuẫn với hiểu biết ngữ nghĩa sâu sắc hơn về vòng lặp for, mà luôn luôn chứa biến thể vòng lặp (thường được xác định là dương tính vì lý do tiện lợi). Đối với ngữ nghĩa nhất quán, phân tách rõ ràng giữa các vòng lặp được biết trước khi thực hiện vòng lặp (vòng lặp) và vòng lặp không biết số lần lặp trước khi thực thi (while-loops). – Schedler

0

Người đầu tiên sẽ không biên dịch. Bạn cần ít nhất: while(true). Chúng tương đương về mặt ngữ nghĩa. Đó là vấn đề về phong cách/lựa chọn cá nhân.

2

Dưới đây là một sự khác biệt nhỏ mà tôi thấy khi tháo gỡ VS2010 ở chế độ gỡ lỗi. Không chắc chắn, nếu đủ, để tính là quan trọngphổ biến đúng sự thật khác biệt (trên tất cả trình biên dịch và với tất cả tối ưu hóa). Vì vậy, khái niệm các vòng này giống nhau, nhưng ở cấp độ bộ vi xử lý, với các vòng tin nhắn vô hạn, chu kỳ đồng hồ cho các lệnh bổ sung/khác nhau có thể khác và tạo ra một số khác biệt.

while(1) 
004113DE mov   eax,1      **// This is the difference** 
004113E3 test  eax,eax      **// This is the difference** 
004113E5 je   main+2Eh (4113EEh) 
     f(); 
004113E7 call  f (4110DCh) 
004113EC jmp   main+1Eh (4113DEh)   **// This is the difference** 
    for(;;) 
     f(); 
004113EE call  f (4110DCh) 
004113F3 jmp   main+2Eh (4113EEh)   **// This is the difference** 
} 
+2

Sự khác biệt này chắc chắn không tồn tại với bất kỳ tối ưu hóa nào được kích hoạt. –

+0

Sự khác biệt chỉ là do chế độ gỡ lỗi có tối ưu hóa bị tắt theo mặc định. 3 dòng đầu tiên thực sự kiểm tra nếu '1! = 0', tức là nếu điều kiện là đúng. – casablanca

+0

Và sự khác biệt trong 'jmp' chỉ là chênh lệch hơi khác một chút. –

1

Không có sự khác biệt.

Nhưng

while() foo();

là không giống nhau mà

for (;; foo();)

Ghi! Nếu bạn phá vỡ trong khi trước khi foo() tuyên bố, foo() không thực hiện, nhưng nếu bạn phá vỡ cho, foo() executes ...

0

chúng đều giống nhau .. trình biên dịch hiện đại phát ra giống hệt nhau mã cho cả hai .. thú vị (lịch sử?) cho (;;) là phổ biến hơn .. pascal lập trình viên đã làm một #define (;;) bao giờ hết, và sử dụng mãi mãi {// code}

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