为什么这个 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
我正在尝试实现鸡尾酒排序,并且在主循环中我正在尝试使用 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