C语言分支与循环

C语言是一门结构化语言,包括三大主要结构:顺序结构,分支结构(if,swtich),和循环结构(for,do  while , while).那么今天我们就来学习分支结构和循环结构

一.if语句

什么是if语句呢,我们来看看他的用法:

# include <stdio.h>
int main()
{
    int a = 0;
    scanf("%d" , &a);

    if(a)//判断真假
    {
       printf("hello");//a为真运行

    }

     return 0;
}

那么这就是一个简单的if的用法,当a为真的时候,则运行printf("hello")这个语句,未假则不会运行.

这里有一个知识点呢:如果if后面跟一条语句的话,这个{}(大括号可以省略哦),多条语句就不可以省略了。可以写成这样

 if(a)
 printf("hello");

  if....else呢,也是同样的道理

# include <stdio.h>
int main()
{

 int a;
 scanf("%d" , &a);
 
   if(a) 
   printf("A");//为真打印A
  
   else
   printf("B");//为假打印B


 return 0;
}

如果a 为真,则运行printf("A");,反之运行printf("B")
 

1.if...else嵌套

在if ...else 中嵌套if....else 构成多重判断

比如:判断一个数是奇数还是偶数,小于0就打印负数

# include <stdio.h>
int main()
{

    int num = 0;
    scanf("%d",&num);
     
    if(num <0)
    printf("负数");

    else
   {
       if(num %2 == 0)
         {
             printf("偶数");

         }
       else
        {
             printf("奇数");
        }


   }
  return 0;

}

那么程序是怎么运行的呢,首先判断a是不是小于0,如果小于则打印负数,结束程序

如果大于0,则跳转到else 里面的if里面判断是不是被2整除,如果是,则打印偶数,相反则打印奇数

我们可不可以优化代码呢,在else 里面的if ....else 其实是一个语句,因为他要么是偶数,要么是奇数,只有两个结果,所以我们可以把它看成一个语句,就可以写成

# include <stdio.h>
int main()
{

    int num = 0;
    scanf("%d",&num);
     
    if(num <0)
    printf("负数");


    else if(num % 2 == 0)
     printf("偶数");


   else
     printf("奇数");

  return 0;
}

2.else 的分配问题

# include <stdio.h>
int main()
{
	int a = 0;
	int b = 1;
	if (a > 1)
		if (b == 1)
			printf("11");
	else
			printf("22");

	return 0;

}

你们这段代码会输出什么呢?答案是什么都不输出,可能会有同学认为输出22,其实并不是这样

因为else总是和他最近的一个if相匹配,这个else 是跟第二个if相匹配的.

所以当第一个if里的表达式为0的时候,程序就结束了什么都不打印.

二.关系操作符

注意:在C语言中 = 是赋值 , ==才是判断相等.

关系操作符通常返回0/1来表示真假

关系操作符的连用: a < b <c ;中, 是先比较a<b得到的返回值再跟c做比较

三.条件运算符(三目运算符)

条件运算符又称三目运算符:
基本理念和if..else相似: d1 ? d2 :d3;

如果表达式d1为真,则运行d2,相反运行d3;

# include <stdio.h>
int main()
{
  //求两个值的最大值
  int a ,b;
  scanf("%d%d" , &a ,&b );

  int max = a > b? a:b;
  printf("%d" ,max);



 return 0;
}

这就是三目操作符的用法了,相当于就是简化版的if...else,这里注意三目操作符的是:(冒号),不是;(分号)

四.逻辑操作符

&&(逻辑与)  表示并且的意思

||(逻辑或) 表示或者的意思

!(取反) 可以把假变真,真变假 

# include <stdio.h>
int main()
{
  int a = 0;
 if(!a)//把假变真
{
 printf("hello");
}

 return 0;
}

这就是取反的用法

那么&& ||的用法呢,我举个例子:判断一年是不是闰年

# include <stdio.h>
int main()
{
	
	int year = 0;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) // 能被4整除并且不能被100整除或者能被400整除的叫闰年
		printf("yes");
	else
		printf("no");



	return 0;
}

能被4整除并且不能被100整除或者能被400整除的叫闰年,我们刚好运用&&,||逻辑操作符来实现这个逻辑.

1.重要知识点短路:

1.在&&中 :表达式1 && 表达式2 只要一个为假,整个逻辑表达式就为假.全部为真整个逻辑表达式才为真
2. 在||中  :  表达式1||表达式2 只要一个为真,整个逻辑表达式就为真,

那什么叫短路呢?

在&&中,如果表达式1为假,就不会执行表达式2,因为只要一个为真就行了。如果表达式1为真,则也要执行表达式2.因为两个真才为真.


在||中, 如果表达式1为假,则会执行表达式2.如果表达式1为真,就不用执行表达式2.因为||有一个真就行了.

我们来看代码

	int a = 3, b = 2, c = 0;
	int i;
	i = c++ && a++;

	printf("%d %d %d", a, c ,i);


在这里面 由于 c++ 为假 所以不会执行a++,整个表达式也就为0;所以最后输出的结果是a=3,c=1,i=0

	int a = 3, b = 2, c = 0;
	int i;
	i = c++ || a++;

	printf("%d %d %d", a, c ,i);

 在||中呢 , c++为假,就要运行a++了,因为||中有一个为真就行了,所以最后的结果就为  a=4,c=1,i=1

五.switch语句

在学完if语句,我们来看看switch语句
switch语句也是分支结构中的语句.用于处理多种情况.

switch(整形表达式)
{
 
  case (整形常量表达式): 
  语句;
  break;

  case ((整形常量表达式))://每一个case 对于不同的情况
  语句2:
  break;


defacult:  //不符合所以case的情况
   语句3;

}

这就是switch的基本理念.

我们来看个例子:
 

# include <stdio.h>
 int main() 
{
  //输入1~7,相对应的星期几
     int num = 0;
     scanf("%d", &num);
    
     switch (num)
     {
     case 1 :
         printf("星期一");
         break;
     case 2:
         printf("星期二");
         break;
     case 3:
         printf("星期三");
         break;
     case 4:
         printf("星期四");
         break;
     case 5:
         printf("星期五");
         break;
     case 6:
         printf("星期六");
         break;
     case 7:
         printf("星期天");
         break;
       

     default:
         printf("输入有错误:请重新输入");

     }
      return 0;
}

1.每一个case 对应一种情况 ,遇到break才会停止 

2.default是不满足所有case情况下,它和case没有前后循序,符合逻辑就行

我们也可以利用.每一个case 对应一种情况 ,遇到break才会停止 这个特性

如果我们要完成1~5为工作日,6~7打印休息日这个逻辑呢?


		 switch (num)
	   {
		 case 1:

		 case 2:

		 case 3:

		 case 4:

		 case 5:
			 printf("工作日");
			 break;
		 case 6:

		 case 7:
			 printf("休息日");
			 break;
		 default:
			 printf("输入有错误:请重新输入");

		 }
		 

 根据题目意思适当去掉break就行了.

六.循环结构语句

1.while语句

那么接下就学我们的循环结构里面的while 循环语句了.

while(表达式)
{
  语句;
}

它的理念和if相似,当表达式为真

当表达式为真,则执行语句,然后再去判断表达式为真,为真继续执行语句,这样就构成了一个循环。

举例:打印1~10的整数

# include <stdio.h>
int main()
{

 int i = 1;//变量初始化

while(i  <= 10)//变量结束条件
{
  printf("%d " , i);
  i++;//循环变量的调整
}



   return 0;
}

2.for语句

那么for语句是怎么样的呢

for(表达式1;表达式2;表达式3)
{
   语句;
}

表达式1:  变量的初始化

表达是2;循环变量的结束条件

表达式3: 循环变量的调整

我们不难发现其实while和for循环中很相似的,就是把三个重要条件集中在一起了

那我们看看for语句来实现1~10的整数吧

for (int a = 1; a <= 10; a++)
{
	printf("%d ", a);
}

这里的执行流程是这样的:

为了方便理解,我们把for()里面的表达式替换成for(1;2;3),后面的语句替换成4;

那么是怎么执行的呢:

先运行1,在运行2,如果条件符合,则运行语句4,不符合结束循环。运行完4,再运行3,再运行2,再次判断为真继续4 3  2 这样运行。直到运行3之后,再运行2 不符合条件,则结束循环

注意:变量的初始化只运行1次哦 

那么在for语句中这三个条件是可以省略不写的[for(  ;    ;    ; )],但是如果循环变量的条件不写的话,就会构成死循环.

3.do... while语句

do ...while 在我们C语言中,用的比较少,因为它会无条件执行一次,再去判断结果

# include <stdio.h>
int main()
{
		int i = 0;

		do
		{

		printf("hehe");
		} while (i);
 
   return 0;
} 

就比如这个代码,先执行printf语句再判断while中的值是否为真。所以不管为真未假,它总是会打印一次

4.break 和 continue 的用法

1.当我们想要提前终止程序的时候,我们就可以使用break语句来提前终止循环

比如:打印1~10的数,当i等于5的时候,跳出循环

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

2.那我们想跳过某一个数呢,比如说跳过5这个数呢?

    for (int i = 1; i <= 10; i++)
    {
        if (i == 5)
        {
            continue;
        }
        printf("%d", i);
    }

那么我们就知道continue不中断程序的运行,是跳过continue后面的代码.

5.循环的嵌套

有时候循环的嵌套,能让我们更好的解决问题

这里举一个详细的例子:打印1~100的质数

    for (int i = 1; i <= 100; i++)
    {
        int flag = 1;//标记,假设一开始是质数
        for (int j = 2; j <= i - 1; j++)
        {
            if (i % j == 0)
            {
                flag = 0;//不是质数就把0赋给flag
                break;
            }
        }
        if (flag == 1)//判断
        {
            printf("%d ", i);
        }

 什么是质数呢,只能被1和自身整除叫质数.

        那我们首先得创建1到100的数字,再创建除了1和自己本身的数字,如果两个整除相除那它就不是质数。我们就可以设个标记,如果不是质数就把标记归零,最后判断标记。最终就可以得出我们想要的效果!

               此文章仅仅是帮助自己更深刻地学习C语言这门知识,如果有错误的话还请大家指点指点,同时也希望帮助到刚开始学习C语言的同学们,谢谢.此外我的Git里面有自己学习的思维导图以及平常写的代码。仓库 - 一个学不明白数据结构的大学生 (a-person-who-doesnt-understand) - Gitee.com
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值