如何理解for循环中的auto deduce?
How to understand auto deduce in for loop?
i初值不等于5,输出无数个数
int main() {
vector<int> nums = {1, 2, 1};
auto size = nums.size();
for(auto i = 2 * size - 1; i >= 0; i--) {
// do_stuff()
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
因为nums.size()
是std::size_t
,是unsigned int
的别名,所以size
是unsigned int
。
auto i = 2 * size - 1;
,因为 size
是一个 unsigned int
,所以编译器决定让 i
成为一个 unsigned int
,所以 i >= 0
总是真的。试图减少它会导致环绕(到 4294967295
)并减少它。
您的问题源于 i
的类型是无符号的,因此 i >= 0
始终为真,导致循环无限。
i
被推导为与 size
相同的类型,而 size
被推导为 size_t
类型,因为 vector::size()
returns size_t
.
由于上述原因,无符号整数溢出,你的循环是无限的。它打印 (*)
5 4 3 2 1 0 4294967295 4294967294 4294967293 ... 3 2 1 0 4294967295 4294967294 ...
无限远。
(*) 如果 size_t
在您的平台上是 32 位。
i初值不等于5,输出无数个数
int main() {
vector<int> nums = {1, 2, 1};
auto size = nums.size();
for(auto i = 2 * size - 1; i >= 0; i--) {
// do_stuff()
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
因为nums.size()
是std::size_t
,是unsigned int
的别名,所以size
是unsigned int
。
auto i = 2 * size - 1;
,因为 size
是一个 unsigned int
,所以编译器决定让 i
成为一个 unsigned int
,所以 i >= 0
总是真的。试图减少它会导致环绕(到 4294967295
)并减少它。
您的问题源于 i
的类型是无符号的,因此 i >= 0
始终为真,导致循环无限。
i
被推导为与 size
相同的类型,而 size
被推导为 size_t
类型,因为 vector::size()
returns size_t
.
由于上述原因,无符号整数溢出,你的循环是无限的。它打印 (*)
5 4 3 2 1 0 4294967295 4294967294 4294967293 ... 3 2 1 0 4294967295 4294967294 ...
无限远。
(*) 如果 size_t
在您的平台上是 32 位。