分支与循环

C语言是结构化的程序设计语言,结构包含顺序结构,选择结构,循环结构。生活中日常所见的事都能拆分为这三种结构的组合。

分支结构

if语句

if语句的语法形式
#include <stdio.h>
int main()
{
    if (表达式)
    语句1
    else if (表达式)
    语句2
    else 
    语句3
    return 0;
}

表达式成立(或为真)则语句执行,若不成立(或为假)则语句1不执行。此外在C语言中,0为假,非零表示真,因此表达式返回的数字结果也能判断真假。

分支中包含多条语句和if嵌套

如果if后面控制着多条语句,则需要用{ }将要执行的语句括起来,else后面也能用大括号。

#include <stdio.h>
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num == 0)
 printf("输⼊的数字是0\n");
 else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
 printf("输⼊的数字是正数\n");
 else
 printf("输⼊的数字是负数\n");
 return 0;
}

有了这种嵌套语句,就可以实现复杂的逻辑判断

悬空else问题

如果有多个if和else,那么else总是和最近的if匹配(就近原则)例如:

#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
   if (a == 1)
   if (b == 2)
printf("dadada\n");
   else 
printf("lalala\n"); 
return 0;
}

程序的结果是什么都不打印,因为第一个if判断为假,而且第二个if是嵌套在第一个里面的,所以嵌套的if就不能执行。为了避免这种容易让人产生误解的情况发生,应该用大括号标明if语句的控制范围或者写注释,提升代码的可读性。

关系操作符

既然在if提到了表达式,那么就不得不介绍一下C语言中的关系操作符了。其中包括但不限于:>,<,>=(大于等于),<=(小于等于),==(等于),!=(不等于)。

注意:“=”并不等于“==”,前面那个是赋值操作符,后面那个是相等操作符,千万不可混淆!

关系表达式的返回结果通常是0(关系判断为假)和1(关系判断为真),并且计算方向为从左到右
因此关系表达式不宜连用,就比如“20>15>10”这个式子,从平常的角度看没有任何问题,但是在C语言中它会先判断20>15这个式子,为真,返回1,然后式子就变成了1>10,为假,返回0。所以在多个关系表达式要同时连用的话通常会用到逻辑操作符

逻辑操作符

或:|| —>两侧至少有一个关系式为真,则输出的结果为真
且:&& —>两侧只要有一个关系式为假,则输出的结果为假
非:! —>改变单个表达式的真假
所以上面那个例子应该写成20>15 && 15>10。

在逻辑操作符中有一个现象叫短路,就是判断完一边就已经知道结果而提前结束判断的情况。例如在“&&”操作符的左边的关系表达式为假,系统就不会判断右边,提前结束并且输出结果为假,在“||”操作符的左边的关系表达式为真,系统就不会判断右边,提前结束并且输出结果为真。

switch语句

switch语句是一种特殊的if…else语句,它的可读性更好但使用范围也有限,使用格式如下

switch (表达式)
{
case 结果1:
    语句1;
    break;
case 结果2:
    语句2;
    break;
default:
    语句3; 
    break;
}

上面的代码中,根据表达式中返回的结果的不同,执行相应的case分支,如果找不到相应的值,则进入default分支。

注意:switch后面表达式必须是整型表达式;case后面的值,必须是整型常量表达式,case和后面的数字之间必须有空格,每一条case语句结束后必须要加一个break来跳出switch语句

switch语句中的break

如果case语句中没有break来跳出分支,那么会出现什么情况,请看代码

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch(n%3)
 {
 case 0:
 printf("整除,余数为0\n"); 
 case 1:
 printf("余数是1\n"); 
 case 2:
 printf("余数是2\n"); 
 }
 return 0;
}

如果输入了4,那么应该打印出“余数是1”和“余数是2”,这就是没有break的缘故,没有break,那么进入到一个case分支后不会主动跳出,会顺着程序执行下去

switch语句中的default

在switch语句中,可能会遇到switch后面的值与case语句不匹配的情况,这时候要不不做处理,要么就在语句中加入default语句,这条语句理论上可以放在switch语句中的任意地方。

循环结构

while循环

while语句的基本形式和if语句的基本形式类似

while (表达式)
     语句;  //如果有更多的语句,那么要加上大括号

实践:在屏幕上打印1-10的数

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)       //i<=10时会循环下去,如果i>10那么循环将终止
 {
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

for循环

for循环是三种循环语句中用的最多的,其基本形式如下:

for (循环变量的初始化;循环结束条件的判断;循环变量的调整)

实践:在屏幕上打印1-10的数

#include <stdio.h>
int main()
{
    int i = 0;
for(i=1; i<=10; i++)
    {
       printf("%d ", i);
    }
return 0;
}

do while循环

do while循环语句使用的最少,其基本形式如下:

do
   语句;
   while (表达式)

while和for循环都是先判断条件,条件满足则进入循环,如果不满足就跳出循环,而do while语句直接进入循环体再执行while后面的判断表达式,表达式若为真则进行下一次,若为假则不再循环。所以do while循环的循环体至少是执行一次的
实践:在屏幕上打印1-10的数

#include <stdio.h>
int main()
{
 int i = 1;
 do
 {
 printf("%d ", i);
 i = i + 1;
 }while(i<=10);
 
 return 0;
}

循环语句中的break和continue语句

在循环执行的时候,如果某些特殊情况发生时,需要提前终止循环,这是非常常见的现象,break和continue就是运用到循环语句中的

braek:永久的终止循环,一旦break被执行,直接跳出循环,继续向后面的程序执行
continue:跳过本次循环continue后面的代码,在for循环和while循环中有差异

循环的嵌套

利用好循环的嵌套能解决一些更复杂的问题
实践:在屏幕上打印出九九乘法表

#include <stdio.h>
int main()
{
	int a, b,c;
	for (a = 1; a < 10; a++)  //循环产生1-9 
	{
		for (b = 1; b <= a; b++)  //循环产生比a小的数字
		{
			c = a * b;
			printf("%d * %d =% d   ", a, b, c);
		}
		printf("\n");
	}
	return 0;
}

goto语句

这是一种特别的语法,goto语句可以实现在同一个函数内跳转到设置好的标号处

#include <stdio.h>
int main()
{
printf("熊大\n");
goto 123:
printf("熊二\n");
123printf("光头强\n");
return 0;
}

在这个代码中,当程序执行到goto语句时,就会跳转到对应名字的那一行继续执行,“熊二”不会被打印出来。

注意:goto语句的使用要恰当,如果一个程序内有很多goto语句那么会显得很混乱,可读性不强

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值