WHILE循环显示出比FOR循环
问题描述:
不同的输出据我所知for
环和while
循环之间的差别看起来是这样的:WHILE循环显示出比FOR循环
为:
拳头初始化时则条件表达式检查如果结果为TRUE
那么只有语句部分得到执行,这个循环是连续的,直到条件表达式结果为FALSE
。
当:
条件表达式首先检查,如果结果TRUE
然后声明部分被执行,否则不,这个循环是连续的,直到条件表达式的结果FALSE
。
今天,我写了检查,如果string
有重复的算法,如果是只打印那些没有:
#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;
}
输出:
Before = Mississippi
After = Misp
现在看如果替换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;
}
但产量并不如预期:
Before = Mississippi
After = Misp
但是:
Before = Mississippi
After = Misisipi
为什么会发生这种情况?
答
现在缺少的是,for
环路初始化j
为0时,它首先进入。
虽然j
被初始化为0,当它宣布,将while
循环另一个while
循环中调用,所以它不会每次都重新初始化。
添加初始化:
j=0;
while(tmp[j] != '\0'){
if(tmp[j] == str[i]){
found++;
}
j++;
}
,你会得到:
Before = Mississippi
After = Misp
+0
哦,我很傻。谢谢。 – Michi
答
因为while循环在最外while循环的每次迭代中不初始化j=0
!
答
请注意,while
循环不会初始化j
到0
。
删除的j
的初始化0
并在嵌套循环while
前面加
j = 0;
。
答
您不会使用while循环将j重置为0。
该位:
for(j=0;
答
for (init-statement(optional) ; condition(optional) ; iteration_expression(optional)) statement
上述语法生成的代码等同于:
{ init_statement while (condition) { statement iteration_expression ; } }
除了由init声明宣称
- 名称(如果初始化语句是一个声明)和条件声明的名称(如果条件是 声明)是在相同的范围(这是声明的范围也是 )。
- 的语句将执行iteration_expression
- 空状态
continue
相当于while(true)
TLDR;请提供一个简短而亲切的[MCVE](http://stackoverflow.com/help/mcve)来说明问题。不要发布有效的代码。 –
@WeatherVane对不起,用示例去掉了部件。 – Michi
Down Voter请解释一下,为什么?有没有机会看到谁投下了我的票? – Michi