for (size_t i = N ; i <= N ; i--) { .... }
Điều này sẽ làm điều đó bởi vì size_t là một int không dấu. Unsigned ints là 32 bit. Khi biến i có giá trị bằng 0, bạn muốn vòng lặp của bạn thực thi điều kiện. Nếu bạn thực hiện i--, máy tính thực hiện
00000000000000000000000000000000
-00000000000000000000000000000001
Kết quả nào tràn đầy, cho giá trị 111111111 ... 1. Đối với số nguyên bổ sung của hai chữ ký, giá trị này rõ ràng là âm. Tuy nhiên, loại i là một int không dấu nên máy tính sẽ giải thích 111111 ... 1 là một giá trị dương rất lớn.
Vì vậy, bạn có một vài tùy chọn:
1) Làm như trên và làm cho vòng lặp kết thúc khi xảy ra tràn.
2) Làm cho vòng lặp chạy từ i = 0 đến i < = N nhưng sử dụng (N-i) thay vì i ở mọi nơi trong vòng lặp của bạn. Ví dụ, myArray [i] sẽ trở thành myArray [N-i] (tắt bởi một tùy thuộc vào giá trị của N thực sự đại diện).
3) Làm cho điều kiện vòng lặp for của bạn khai thác ưu tiên của toán tử đơn nhất. Khi một người dùng khác đăng,
for (size_t i = N + 1 ; i-- > 0 ;) { ... }
Điều này sẽ đặt i thành N + 1, kiểm tra xem điều kiện N + 1> 0 vẫn giữ. Nó có, nhưng i-- có một tác dụng phụ, vì vậy giá trị của i bị giảm xuống i = N. Tiếp tục đi cho đến khi bạn nhận được i = 1. Điều kiện sẽ được kiểm tra, 1> 0 là đúng, tác dụng phụ xảy ra , sau đó i = 0 và nó thực thi.
Hmm đó là câu hỏi thực sự hay. –
'size_t' được đảm bảo để được unsigned, và cách sử dụng của bạn' (size_t) -1' là chính xác. Bạn chỉ gặp vấn đề khi N bằng giá trị đó ... –
Làm thế nào để thực hiện {} khi (i--)? – supercat