为什么这个 for 循环与 while 循环不一样?

Why this for loop doesn't do the same that the while loop?

我正在尝试实现鸡尾酒排序,并且在主循环中我正在尝试使用 for 循环而不是 while,但它没有给我相同的结果。 这是 while 循环的代码:

template<typename T>
void cocktail(std::vector<T>& vec)
{
    std::size_t beg = 1;
    std::size_t end = vec.size()-1;
    bool change = true;

    while((beg < end) && (change))
    //for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)
    {
        change = false;
        for(std::size_t j = beg; j <= end; j++){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        end--;
        for(std::size_t j = end; j >= beg; j--){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        beg++;
    }
}

输出:

Before: 3 2 0 9 5 7 8 1 4 6
 After: 0 1 2 3 4 5 6 7 8 9

这里是 for 循环:

template<typename T>
void cocktail(std::vector<T>& vec)
{
    //std::size_t beg = 1;
    //std::size_t end = vec.size()-1;
    bool change = true;

    //while((beg < end) && (change))
    for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)
    {
        //change = false;
        for(std::size_t j = beg; j <= end; j++){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        end--;
        for(std::size_t j = end; j >= beg; j--){
            if(vec[j] < vec[j-1]){
                std::swap(vec[j-1], vec[j]);
                change = true;
            }
        }
        beg++;
    }
}

输出:

Before: 3 2 0 9 5 7 8 1 4 6
 After: 0 2 1 3 5 7 8 4 6 9

你知道为什么我得到不同的输出吗?如果您想查看主文件或其他内容,我的代码位于here

for 循环中,"increment"(第3 部分)在条件(第2 部分)被求值之前执行。你的情况

for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change); change = false)

您不是在递增变量,而是在设置 change = false;。但是,这仍然在评估条件之前执行。因此,条件始终为假。相反,在 while 循环中,您设置 change = false; inside 循环,after 条件已被评估。这意味着您的 2 个循环不等效。

在你的 For 循环中,从 for()[=34= 中删除 (change = false) ] 陈述。让 for 语句为

for(std::size_t beg = 1, end = vec.size() - 1; (beg < end) && (change);)
{
    // Write here
    change= false;
    ......
}

它会起作用。

解释: 在你的 while 循环代码中,你的 change 在第一步。 但是在您的 for 循环中, change = false 语句在循环结束时设置为 false。作为 for 循环的第三个参数作为循环的最后一条语句执行。

考虑一个例子:

for(i=0;i< n;i++)

i 最后递增,而不是首先递增。这是您的解决方案的问题。

for (size_t i = 0; i < 10; i++)
    body();

相当于

size_t i = 0;
while (i < 10) {
    body();
}

您的代码使用

for (bool change = true; change; change = false)
    body();

相当于

bool change = true;
while (change) {
    body();
    change = false;
}

第一次通过此循环后,在循环开始时的条件测试期间,change 将始终为 false。

for ( initial ; condition ; iterate )
               ^-------------------v