第005章——循环语句(while,do-while,for,goto)
C语言中的循环语句的作用是为了使同一个事物具有相同的操作,这可以大大减少程序的复杂性,能够提高程序的运行效率
while (条件表达式)
{
循环语句;
}
如果判断while循环的条件表达式一直为非0(真),那么循环体不会停止。在while 循环中,break用于永久的终止循环;continue的作用是跳过本次循环(就是跳过continue后面的代码),直接去回到判断部分(判断条件表达式),看是否需要进入下一次循环。
//求小于10的奇数和
int main()
{
int i,sum = 0;//初始化
i = 1;
while(i < 10)//判断部分
{
sum = sum + i;
i += 2;//调整部分
}
printf("%d\n",sum);//25
return 0;
}
循环控制变量:在表达式中出现的变量为循环控制变量(此例中的 i )。
注意: ①循环控制变量必须有正确的初值;②在循环体内要有改变它的语句(例如:i += 2);③i < 10为条件表达式,也为循环结束条件,若没有则最终会形成死循环。④若while循环不加{ },那么只会执行第一条语句。
当我们使用while循环时,会发现它的初始化部分,判断部分,调整部分很分散,我们在这三部分中充盈代码块的同时,也使得代码看起来繁琐,不易查找,所以就有了for循环。
for (表达式1; 表达式2; 表达式3)
循环语句;
你可以把for循环的表达式1看为初始化部分,表达式2为判断部分,表达式3为调整部分。先执行初始化部分(表达式1),给循环变量赋初始值,只执行一次;再进行判断部分,如果设循环体执行n次,那么表达式2要执行n+1次; 然后执行循环语句;最后才执行表达式3,如果设循环体执行n次,那么表达式3也要执n次。
//计算1-10之间数之和。
int main()
{
int i = 0;//可以直接写成int i,sum = 0;
int sum = 0;
for (i=1; i<=10; i++)
{
sum=sum+i;
}
printf("%d\n",sum);
return 0;
}
或者这样写也是没有问题的:
//计算1-10之间数之和。
int main()
{
int i = 0;
int sum = 0;
for (i=1; i<=10; i++) sum=sum+i;
printf("%d\n",sum);
return 0;
}
当然这三个表达式是根据你的需求使用,可以省略其中一个、两个甚至全部省略,但是要保留 " ; "
int main()
{
for ( ; ; )//判断部分的省略——判断部分恒为真
{
printf("死循环\n");
}
return 0;
}
省略的同时,也会给我们带来一些问题:
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)//for1
{
for (; j < 3; j++)//for2
{
printf("你猜我会被打印多少次?\n");
}
}
return 0;
}
结果是
你猜我会被打印多少次?
你猜我会被打印多少次?
你猜我会被打印多少次?
你是不是以为会被打印9次?我们来仔细分析一下,第一次进入for1:i = 0,0<3;进入for2:j = 1…for2循环3次,得到 j = 3,然后再返回到for1,此时 i = 1,1<3;但是不进入for2循环,因为 j 是在循环外赋值,未重新赋值归0,此时 j 仍然=3,j < 3条件不成立,for2循环不进行,所以最后只打印了 i = 0时的三次。
如果想打印9次,就应该改为:
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("你猜我会被打印多少次?\n");
}
}
return 0;
}
for循环也可以多个变量进行
int main()
{
int x,y;
for (x = 0,y = 0; x < 2 && y < 5; ++x,y++)
{
printf("我循环了几次?\n");//循环了两次哦!
}
return 0;
}
++x,x++是一样的啊,只不过一个是先++再赋值给x,一个是先赋值给x,再++
do
{
循环语句;
}while (表达式);
do-while会先执行循环语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。do 语句特点:循环至少执行一次。
do-while循环与while循环的不同:do-while先执行,后判断;while先判断,后执行
int main()
{
int i = 1;
int sum = 0;
do
{
sum = sum + i;
i+=2;
} while (i <= 10);
printf("%d\n",sum);//25
}
写个简单的猜数字游戏:
用do-while来写就可以实现先玩,再判断,一把过不了,就来下一把。
#include
void game()//游戏函数
{
int ret = rand()%100 + 1;//%100的余数是0-99,然后+1,范围就是1-100
int num = 0;//猜的数字
while(1)
{
printf("请输入数字:>");
scanf("%d",&num);
if (num > ret)
{
printf("猜大了!\n");
}
else if (num < ret)
{
printf("猜小了!\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
int main()
{
int button = 0;
srand((unsigned int)time(NULL));
do
{
printf("1.开始玩游戏 0.退出游戏");
printf("请选择:>");
scanf("%d",&button);
switch (button)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入无效\n");
break;
}
} while(button);
return 0;
}
C 语言中的 goto 语句允许把控制权无条件转移到同一函数内的被标记的语句。正是由于它可以随意跳转,使得程序混乱,被人摒弃。 goto 语句一个好处就是可以保证程序存在唯一的出口,避免了过于庞大的 if嵌套。return是将整个函数返回,不在继续函数。break只能跳出单层循环,而goto可以从多重循环中直接跳出到循环外面,不需要写很多break。
向后跳转
label://冒号
语句;
goto label;
这样也是对的:(向前跳转)
goto label;
语句;
label:
可以实现从循环体内跳转到循环体外,但不能从循环体外转入体内。 相当于是给循环语句一个标签 flag,然后利用goto语句,又跳转回到了标签flag。
你甚至可以把它理解成一个,你写了一个叫flag的云存档,编译器从上之下扫描,扫描到你的flag里循环的内容了,然后存档,你后期要用就用goto语句读档调用flag。 使用 goto 语句只能 goto 到同一函数内,而不能从一个函数里goto到另外一个函数里。
int main()
{
int i = 1;
int sum = 0;
flag:
if (i <= 10)
{
sum += i;
i++;
goto flag;
}
printf("%d\n",sum);//55
return 0;
}
以上就是今天记录的内容,本文仅仅简单介绍了C语言中循环语句的使用,和内层运用逻辑。希望对大家有所帮助,如果上文内容有些个人理解误导了大家,就…就…就怎么呢,就指正一下吧,毕竟这就是个小白学习记录是吧。(求生欲:小白专属)