C WHILE循环显示的输出与FOR循环不同

C WHILE循环显示的输出与FOR循环不同,c,for-loop,while-loop,C,For Loop,While Loop,据我所知,for循环和while循环的区别如下: 用于: 首先进行初始化,然后检查条件表达式,如果结果为TRUE,则只执行语句部分。此循环是连续的,直到条件表达式结果为FALSE 而: 首先检查条件表达式,如果结果TRUE,则执行语句部分,否则不执行,此循环将持续,直到条件表达式结果FALSE 今天我写了一个算法,检查字符串是否有重复项,如果有,只打印那些没有重复项的: #include<stdio.h> #include<string.h> int main(voi

据我所知,
for
循环和
while
循环的区别如下:

用于:

首先进行初始化,然后检查条件表达式,如果结果为
TRUE
,则只执行语句部分。此循环是连续的,直到条件表达式结果为
FALSE

而:

首先检查条件表达式,如果结果
TRUE
,则执行语句部分,否则不执行,此循环将持续,直到条件表达式结果
FALSE


今天我写了一个算法,检查
字符串是否有重复项,如果有,只打印那些没有重复项的:

#include<stdio.h>
#include<string.h>

int main(void){
    const char *str = "Mississippi";
    char tmp[15] = {0};
    size_t i=0,j=0,k=1;
    int found=0;

    tmp[0] = str[0];

    printf("Before = %s\n",str);
    while(str[i] != '\0'){
        for(j=0;tmp[j] != '\0';j++){
            if(tmp[j] == str[i]){
                found++;
            }
        }

        if(found==0){
            tmp[k]=str[i];
            k++;
        }

        found=0;
        i++;
    }

    tmp[strlen(tmp)] = '\0';
    printf("After  = %s\n",tmp);
    return 0;
}
现在观察如果更换
for
循环会发生什么:

for(j=0;tmp[j] != '\0';j++){
    if(tmp[j] == str[i]){
        found++;
    }
}
使用“while”循环:

while(tmp[j] != '\0'){
    if(tmp[j] == str[i]){
        found++;
    }
    j++;
}
我得到:

#include<stdio.h>
#include<string.h>

int main(void){
    const char *str = "Mississippi";
    char tmp[15] = {0};
    size_t i=0,j=0,k=1;
    int found=0;

    tmp[0] = str[0];

    printf("Before = %s\n",str);
    while(str[i] != '\0'){
        while(tmp[j] != '\0'){
            if(tmp[j] == str[i]){
                found++;
            }
            j++;
        }

        if(found==0){
            tmp[k]=str[i];
            k++;
        }

        found=0;
        i++;
    }

    tmp[strlen(tmp)] = '\0';
    printf("After  = %s\n",tmp);
    return 0;
}
但是:


为什么会发生这种情况?

因为while循环不会在最外层while循环的每次迭代中初始化
j=0

因为while循环不会在最外层while循环的每次迭代中初始化
j=0

注意,
while
循环不会将
j
初始化为
0

删除
j
0
的初始化并添加

j = 0;

在嵌套的
while
循环前面。

请注意
while
循环不会将
j
初始化为
0

删除
j
0
的初始化并添加

j = 0;

在嵌套的
while
循环前面。

您从未使用while循环将j重置为0

此位:

for(j=0;

使用while循环永远不会将j重置为0

此位:

for(j=0;

缺少的是
for
循环在第一次进入时将
j
初始化为0

虽然
j
在声明时被初始化为0,但是
while
循环在另一个
while
循环中被调用,因此它不会每次都被重新初始化

添加初始化:

    j=0;
    while(tmp[j] != '\0'){
        if(tmp[j] == str[i]){
            found++;
        }
        j++;
    }
你会得到:

Before = Mississippi
After  = Misp

缺少的是
for
循环在第一次进入时将
j
初始化为0

虽然
j
在声明时被初始化为0,但是
while
循环在另一个
while
循环中被调用,因此它不会每次都被重新初始化

添加初始化:

    j=0;
    while(tmp[j] != '\0'){
        if(tmp[j] == str[i]){
            found++;
        }
        j++;
    }
你会得到:

Before = Mississippi
After  = Misp

上述语法生成的代码相当于:

{
  init_statement 
  while ( condition ) { 
    statement 
    iteration_expression ; 
  }
}
除了

  • init语句声明的名称(如果init语句是声明)和条件声明的名称(如果条件是声明) 声明)在同一范围内(这也是 声明)
  • continue
    中的语句将执行迭代\u表达式
  • 空条件相当于
    while(true)
  • 上述语法生成的代码相当于:

    {
      init_statement 
      while ( condition ) { 
        statement 
        iteration_expression ; 
      }
    }
    
    除了

  • init语句声明的名称(如果init语句是声明)和条件声明的名称(如果条件是声明) 声明)在同一范围内(这也是 声明)
  • continue
    中的语句将执行迭代\u表达式
  • 空条件相当于
    while(true)

  • 太长,读不下去了请提供一个简短的例子来说明这个问题。不要发布有效的代码。@WeatherVane很抱歉,用示例删除了该部分。请解释,为什么?有没有机会看到谁投了我的反对票?这标志着我的评论在上面-但这不是我的反对票。我真的需要知道,这个问题出了什么问题。这不对,这里发生了什么事;请提供一个简短的例子来说明这个问题。不要发布有效的代码。@WeatherVane很抱歉,用示例删除了该部分。请解释,为什么?有没有机会看到谁投了我的反对票?这标志着我的评论在上面-但这不是我的反对票。我真的需要知道,这个问题出了什么问题。这不对,这里发生了什么。