Tôi đã thực hiện một số nghiên cứu về Stackoverflow về đảo ngược cho các vòng lặp trong C++ sử dụng số nguyên không dấu thay vì số nguyên đã ký. Nhưng tôi vẫn KHÔNG hiểu tại sao có vấn đề (xem Unsigned int reverse iteration with for loops). Tại sao mã sau đây sẽ sinh ra lỗi phân đoạn?Số nguyên chưa được ký trong C++ cho vòng
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{
vector<double> x(10);
for (unsigned int i = 9; i >= 0; i--)
{
cout << "i= " << i << endl;
x[i] = 1.0;
}
cout << "x0= " << x[0] << endl;
return 0;
}
Tôi hiểu rằng vấn đề là khi chỉ số tôi bằng 0, bởi vì có điều gì đó giống như tràn. Nhưng tôi nghĩ rằng một số nguyên không dấu được phép lấy giá trị bằng không, phải không? Bây giờ nếu tôi thay thế nó bằng một số nguyên đã ký, thì hoàn toàn không có vấn đề gì.
Có ai đó có thể giải thích cho tôi cơ chế đằng sau vòng lặp ngược đó với số nguyên không dấu?
Cảm ơn bạn rất nhiều!
'i> = 0' luôn đúng với' i' chưa được ký, vì vậy vòng lặp không bao giờ kết thúc. – TonyK
Đọc cảnh báo trình biên dịch, chúng hữu ích. Trong trường hợp này, trình biên dịch của bạn có thể đã cảnh báo bạn về thực tế là điều kiện trong vòng lặp của bạn luôn đúng. – dragonroot
@dragonroot: Thật không may là không. Tôi sử dụng cờ -Wall của g ++. Bạn có biết một lá cờ trình biên dịch sẽ phát hiện loại vấn đề này không? Cảm ơn. – Benjamin