Trong sự so sánh (i <= u)
, i
được nâng cấp lên một số nguyên unsigned, và trong quá trình -1 được chuyển thành UINT_MAX.
Chuyển đổi một số tiêu cực đến một int unsigned sẽ thêm (UINT_MAX + 1) để con số đó, vì vậy -1 trở thành UINT_MAX, -2 trở thành UINT_MAX - 1, vv
Nếu bạn nghĩ về nó, người ta phải được chuyển đổi sang người khác để so sánh thậm chí làm việc, và như một quy tắc trình biên dịch chuyển đổi giá trị đã ký thành unsigned. Trong trường hợp này, tất nhiên, nó sẽ có ý nghĩa hơn để chuyển đổi giá trị unsigned để ký thay vào đó, nhưng trình biên dịch không thể quyết định theo một thông số khác dựa trên những gì bạn dự định. Bạn nên rõ ràng cast int unsigned để ký (hoặc chỉ có nó như đã ký tất cả cùng) ở đây.
Ngoài ra, bạn nên sử dụng 'std :: endl' thay vì chèn' \ n' vào luồng, vì 'std :: endl' cả hai đều là di động và đảm bảo đầu ra được hiển thị ngay lập tức. –
@Ben: '\ n' chỉ là di động; bạn chỉ nên sử dụng 'endl' nếu bạn đặc biệt muốn luồng này được xả sạch ngay bây giờ. –
'\ n' là di động (nó được chuyển đổi thành chuỗi ngắt dòng của nền tảng) và không mang chi phí của việc xả luồng ngay lập tức. Bạn nên sử dụng cái có ngữ nghĩa bạn muốn: nếu bạn muốn dòng được xóa, sử dụng 'endl', nếu bạn chỉ muốn ngắt dòng, sử dụng' \ n'. – jalf