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ọng và phổ 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**
}
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. –
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; }} '. –
Đố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