C++ 反向 'for' 循环
C++ reverse 'for' loop
我有一个向量:
std::vector<int> vec = {1, 2, 3};
我想制作一个反向 for
循环。它有效,当我写:
for(int i = vec.size() - 1; i >= 0; --i) {
std::cout << i << std::endl; // 2, 1, 0
}
但是如果我写:
for(size_t i = vec.size() - 1; i >= 0; --i) {
std::cout << i << std::endl;
}
但是当我写的时候它们都有效:
for(int i = 0; i < vec.size() - 1; ++i) {
std::cout << i << std::endl; // 1, 2, 3
}
// Or
for(size_t i = 0; i < vec.size() - 1; ++i) {
std::cout << i << std::endl; // 1, 2, 3
}
为什么我在使用 size_t
时会得到错误的向量大小?
我认为转换有问题。
问题是 size_t
是一个 无符号 整数,即它只能有正值。当您为无符号类型减少 0 时,会发生下溢,结果通常是该类型可表示的最大整数,例如18446744073709223794 在你的情况下。最后,对于任何无符号类型,i >= 0
的检查始终为真,您的循环将永远不会终止。
让编译器告诉你哪里出了问题!
如果您在启用警告的情况下编译您的程序,编译器会tell您像这样:
<source>: In function 'int main()':
7:43: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
7 | for(std::size_t i = vec.size() - 1; i >= 0; --i) {
| ~~^~~~
这是为什么?这是因为std::size_t
is an unsigned type in C++; it only represents non-negative numbers. Read more about turning on warnings and why it's important:
那么,我们应该如何反向迭代?
我决定将我的回答拆分成一个单独的问题,独立于 OP 的错误。请.
我有一个向量:
std::vector<int> vec = {1, 2, 3};
我想制作一个反向 for
循环。它有效,当我写:
for(int i = vec.size() - 1; i >= 0; --i) {
std::cout << i << std::endl; // 2, 1, 0
}
但是如果我写:
for(size_t i = vec.size() - 1; i >= 0; --i) {
std::cout << i << std::endl;
}
但是当我写的时候它们都有效:
for(int i = 0; i < vec.size() - 1; ++i) {
std::cout << i << std::endl; // 1, 2, 3
}
// Or
for(size_t i = 0; i < vec.size() - 1; ++i) {
std::cout << i << std::endl; // 1, 2, 3
}
为什么我在使用 size_t
时会得到错误的向量大小?
我认为转换有问题。
问题是 size_t
是一个 无符号 整数,即它只能有正值。当您为无符号类型减少 0 时,会发生下溢,结果通常是该类型可表示的最大整数,例如18446744073709223794 在你的情况下。最后,对于任何无符号类型,i >= 0
的检查始终为真,您的循环将永远不会终止。
让编译器告诉你哪里出了问题!
如果您在启用警告的情况下编译您的程序,编译器会tell您像这样:
<source>: In function 'int main()':
7:43: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
7 | for(std::size_t i = vec.size() - 1; i >= 0; --i) {
| ~~^~~~
这是为什么?这是因为std::size_t
is an unsigned type in C++; it only represents non-negative numbers. Read more about turning on warnings and why it's important:
那么,我们应该如何反向迭代?
我决定将我的回答拆分成一个单独的问题,独立于 OP 的错误。请