Chúng tôi sử dụng loại Integer đại diện cho các biến chỉ số hầu hết thời gian. Nhưng trong một số tình huống, chúng tôi buộc phải chọn
std::vector<int> vec;
....
for(int i = 0; i < vec.size(); ++i)
....
Điều này sẽ khiến trình biên dịch đưa ra cảnh báo rằng việc sử dụng hỗn hợp các biến đã ký / không dấu. nếu tôi thực hiện biến chỉ số là for( size_t i = 0; i < vec.size(); i++ )
, (hoặc một unsigned int
) nó sẽ sắp xếp các vấn đề.
Khi sử dụng các loại cửa sổ cụ thể hơn, hầu hết các API Windows đang xử lý DWORD (mà typedef-ed là không dấu dài).
Vì vậy, khi tôi sử dụng phép lặp tương tự, một lần nữa sẽ gây ra cảnh báo tương tự. Bây giờ nếu tôi viết lại nó thành
DWORD dwCount;
....
for(DWORD i = 0; i < dwCount; ++i)
....
Tôi thấy điều này hơi kỳ lạ. Nó có thể là vấn đề với nhận thức.
Tôi đồng ý rằng chúng tôi phải sử dụng cùng một loại biến chỉ mục để tránh các vấn đề phạm vi có thể xảy ra với các biến chỉ mục. Ví dụ: nếu chúng ta đang sử dụng
_int64 i64Count; //
....
for(_int64 i = 0; i < i64Count; ++i)
....
Nhưng trong trường hợp DWORD, hoặc số nguyên không dấu, có bất kỳ vấn đề nào khi viết lại nó dưới dạng
for(int i = 0; (size_t)i < vec.size(); ++i)
Làm thế nào hầu hết mọi người đang làm việc với các vấn đề tương tự?
std::size_t
là một thứ hạng cao hơn int (hoặc thậm chí dài). Nếu kích thước của vectơ vượt quá std::numeric_limits<int>::max()
, bạn sẽ hối tiếc vì đã sử dụng int.