C++ 使用for循环的索引问题
我有一个for循环,当我处理未签名的类型时,我使用了slide操作符。基本上可以归结为C++ 使用for循环的索引问题,c++,loops,for-loop,do-while,C++,Loops,For Loop,Do While,我有一个for循环,当我处理未签名的类型时,我使用了slide操作符。基本上可以归结为 for (std::size_t i = 6; i --> 0;){ cout << i; } (标准::大小\u t i=6;i-->0;)的{ 这是一块试金石 这个所谓的“操作员”应该谨慎使用,如果有的话 更改for循环的条件检查中变量的状态时,如果有必要,应特别小心 最大输出为5,原因很简单,i作为条件测试的结果而递减,条件测试也递减i。在程序控制进入循环体之前运行条件检查
for (std::size_t i = 6; i --> 0;){
cout << i;
}
(标准::大小\u t i=6;i-->0;)的{
这是一块试金石
这个所谓的“操作员”应该谨慎使用,如果有的话
更改for
循环的条件检查中变量的状态时,如果有必要,应特别小心
最大输出为5,原因很简单,i
作为条件测试的结果而递减,条件测试也递减i
。在程序控制进入循环体之前运行条件检查
你真的应该重写循环。不要将i
的初始值设置为7,因为这是一个肮脏的黑客行为。尽管-->
经常与while
一起使用(需要强调的是,它不太可能在你的编程评论中赢得很多朋友),我以前从未见过它与for循环一起使用。在for语句中评估此条件之后
i --> 0
i将等于5
。因此循环的第一次迭代输出
5
要达到您想要的效果,请按以下方式重写循环
#include <iostream>
int main()
{
size_t i = 6;
do
{
std::cout << i;
} while ( i-- > 0 );
return 0;
}
#include <iostream>
int main()
{
const size_t N = 6;
for ( size_t i = N, j = N; j != 0; j = i-- )
{
std::cout << i;
}
return 0;
}
另一种方法如下
#include <iostream>
int main()
{
for ( size_t i = 6; std::cout << i && i != 0; i-- )
{
//
}
return 0;
}
-->
不是幻灯片操作员
编译器将其理解为两个不同的运算符--
和
在编译器看来,您的代码如下所示:
for (std::size_t i = 6; (i--) > 0;){
cout << i;
}
for(std::size\u t i=6;(i--)>0;){
难道我在这里不知所措了吗?我应该对此进行表决,因为这个问题写得很好,有一个很好的例子。但背后的概念很糟糕。为什么有人会写这样的代码?“幻灯片”操作符??你只是在做这个(我--)>0;
@Bathsheba,这个问题为讨论其主题的严重性打开了大门。由于它也写得很好,我认为这是一个非常好的问题。实际上,“滑动操作符”应该做的正是:在区间内迭代索引[0,count][
,其中假定包含零,而不包含计数。就像在C中对数组进行索引一样。因此,对于向量数组
,以下内容是正确的:对于(size_t i=array.size();i-->0;){…}
,甚至更短:对于(size_t i=array.size();i--){…}
。
#include <iostream>
int main()
{
const size_t N = 6;
for ( size_t i = N, j = N; j != 0; j = i-- )
{
std::cout << i;
}
return 0;
}
6543210
for (std::size_t i = 6; (i--) > 0;){
cout << i;
}