Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用for循环的索引问题_C++_Loops_For Loop_Do While - Fatal编程技术网

C++ 使用for循环的索引问题

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循环,当我处理未签名的类型时,我使用了slide操作符。基本上可以归结为

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;
    }