操作符&C语言分支循环语句(详细讲解版)


新人创作不易,希望各位客观点个赞关个注,我们一起来学习!(以后会继续法各种讲解)

感谢!!!!!!!!!!!!各位的点赞关注是我持续更新的动力【> - <】


1.if语句

2.关系操作符

3.条件操作符

4.逻辑操作符

5,switch语句

6.while循环

7.for循环

8.do-while循环

9.breakcountinue语句

10.循环的嵌套

11.goto语句

正文开始

1.  if语句


1.1  if语句基本语法句式如下:

#include<stdio.h>
int main()
{
  if(表达式)
      (语句)
  return 0;
}

 

当表达式成立(为真)时,则if语句执行。若不成立(为假),则语句不执行。


举例1
#include<stdio.h>
int main()
{
   if(1+1==2)
      printf("你真棒")
   return 0;
}

举例2
#include<stdio.h>
int main()
{
   if(1+1==3)
      printf("你真棒")
   return 0;
}

在举例1与举例2中,1表达式成立,2表达式不成立。所以举例1结果可以正常输出(你真棒!)

举例2则不能。

此外在c语句中 0 代表假 1 代表真,所以当表达式结果为0时,语句不执行,结果为1时,语句执行。


举例3(数入一个数判断是否为判断奇数)
#include<stdio.h>
int main()
{
  int n = 0;//初始化n=0
  scanf("%d",&n);//输入一个数给n
  if(n%2 == 1)//判断n余上2是否为1。如果是则返回出1,打印n.如果不是返回0,则不打印n。
        printf("%d 为奇数",n);
  return 0;
}

注意

1.在if语句中,(若没有大括号)则if语句只作为下一行代码的条件。若表达式下有多条语句注意要打大括号,在括号里的我们叫程序块或者复合语句。建议不管在哪种情况下都养成打括号的习惯。


举例(结果为6)

#include<stdio.h>
int main()
{  
   int n = 0;
   if(1)
   {
     n=n+1;
     n=n+2;
     n=n+3;
   }
   printf("%d",n);
   return 0;
}
#include<stdio.h>
int main()
{
    int n = 0;
    if (1)
        n = n + 1;
        n = n + 2;
        n = n + 3;
    
    printf("%d", n);
    return 0;
}

此时第二个代码输出值为1,明显不是6。可知if下只运行了(n = n+1)这一行代码。而第一个代码由于打了大括号,三条语句都能被执行,输出为6。


1.2   else

如果一个数不是奇数,那就是偶数了,如果我们要输入任意数来判断是奇数还是偶数,这里就需要用if....else....语句,语法格式如下:

int main()
{
    int n = 0;
    scanf_s("%d", &n);
    if (n % 2 == 1)
    {
        printf("%d 为奇数\n", n);
    }
    else//如果不是奇数则else为偶数
    {
        printf("%d 为偶数\n", n);
    }
    return 0;
}

练习1.

输入一个数,判断是否为3的倍数;是的话输出:是;否则输出:不是。

#include<stdio.h>
int main()
{
    int n = 0;
    scanf_s("%d", &n);
    if (n % 3== 0)
    {
        printf("是");
    }
    else
    {
        printf("不是");
    }
    return 0;
}

注意:else和if一样当有多条语句需要被执行时一样要打大括号。


1.3  嵌套if

在 if else 语句中else 可以与别的另一个if 语句连用,构成多重判断。

例如:输入一个数,判断是0,正数还是负数。

#include<stdio.h>
int main()
{
	int n = 0;
	scanf_s("%d", &n);
	if (n == 0)
	{
		printf("输入的数字是0\n");
	}
	else if (n > 0)
	{
		printf("输入的数字是正数\n");
	}
	else
	{
		printf("输入的数字是负数\n");
	}
	return 0;
}​

从else if 的 if 开始,和下面else组合成为一个 if else语句,嵌套在上一个 if else 语句中,这就是嵌套语句。

此外,if语句中也能嵌套if 和 else(但是单个else中不能嵌套单个else)

例如

int main()
{
	int n = 0;
	scanf("%d", &n);
	if (n > 0)
	{
		if (n > 100)//if里嵌套if
		{
			printf("n是正数且大于100\n");
		}
		else//if里嵌套else
		{
			printf("n是正数但小于100\n");
		}
	}
	else//if里嵌套else
	{
		printf("n小于100\n");
	}
		
	return 0;
}​

1.5  悬空else问题

如果有多个if 和 else,else总是和最近的if匹配。

int main()
{
	int a = 0;
	int b = 0;
	if (a == 1)
		if (b == 2)
			printf("nihao");
	else
		printf("nihao");
	return 0;
}

这个代码刚开始很多都以为会打印出nihao,但当真正去执行时,没有任何结果输出,这是为什么呢?

这个代码中,由于最后一个else和第一个if 是对齐的,让我们误以为这二者组成if else 语句。恰恰相反,这个语句中的else是和上一个(最近的if)组合,也就是说,这其实是一个 if else 语句嵌套在上一个if语句中。第一个if的表达式为这个符合语句前提条件,此时这表达式不成立,所以无结果。

这样容易理解些:

​
int main()
{
	int a = 0;
	int b = 0;
	if (a == 1)
    {
		if (b == 2)
			printf("nihao");
	    else
		printf("nihao");
     }
	return 0;
}

​

如果我们要完成最后一个else和最前面的if组合,那我们可以这样子写:

​
int main()
{
	int a = 0;
	int b = 0;
	if (a == 1)
    {
		if (b == 2)
			printf("nihao");
    }
 	else
    {
		printf("nihao");
    }
	return 0;
}

​

两个大括号将else 和 if 的语句分开,使代码更清晰。大家认识到大括号的重要性了吧!,还是推荐大家多多利用大括号!

2.  关系操作符


1.> 大于运算符

2.<小于下运算符

3.>=大于等于运算符

4.<=小于等于运算符

5.==相等于运算符

6.!=不向等于运算符

例子
a == b;
a != b;
a < b;
a <=b;
a > b;
a >=b;

这些表达式通常返回1或者0来表示真假。

C语言中0表示假,非0表示真。这些关系表达式通常用于if或者while结构。

if( x == 3)
{
   printf("hhaha")
}

注意:== 符号和 = 符号不是一样的。==是赋值符号,将符号右边的值赋值给左边的变量(也就是说左右两边不可以互换)。而 = 号左右可以互换。不小心写错可以运行,但通常会影响结果!如果这代码中表达式写成(x = 3),则if判断此时永远成立,永远为真。

为避免这种情况我们可以加上:/*报错*/

/* 报错*/
if(x =3 )......

此时误写就会报错!

另一个就是要注意:多个关系运算符不宜连用。例如:u<o<p

此时通常不会报错,但由于此时关系运算符是从左边到右边计算,实际执行的是(u<o)<p。(u<o)执行完后返回的是0或者1。最后是0或者1和p进行比较,此时会产生不想要的结果。

如果想要判断变量o是否在u和p之间,我们可以这样写:

u < o && j < j;//此时&&指的是并且的意思
举例

输入一个岁数,如果在65到100之间,输出老年。

如果我们这样写:

int main()
{
	int age = 0;
	scanf("%d", &age);
	if (65 <= age <= 100)
	{
		printf("老年\n");
	}
	return 0;
}

则我们有这样的结果:

10
老年

这是应为当我们表达式为(65<=age<=100) 时,我们先执行的时(65<=age)此时我们的age时输入值10,则(65<=10)不成立。返回0,再进行(0<100),此时表达式成立。打印“老年”。那我们应该怎么写呢?

int main()
{
	int age = 0;
	scanf_s("%d", &age);
	if (65 <= age &&age<= 100)
	{
		printf("老年\n");
	}
	return 0;
}

 这样写输出就是对的!


3.  条件操作符

条件操作符又名三目操作符,需要接受三个操作数的,例如:

exp1 ? exp2 :exp3

如果exp1为真则,exp2计算,结果是整个表达式结果;如果exp1为假,则exp3计算,结果为整个表达式结果。 

练习1:使用条件表达式实现找出两个数中较大值
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int m = a > b ? a : b;
	printf("%d\n", m);
	return 0;
}

 4.  逻辑操作符:&&,||,!

逻辑运算符提供的是逻辑判断功能,用于构建复杂表达式,主要有以下三个:

1. ! :逻辑取反运算符(改变单个表达式的真假)

2. && :逻辑与运算符,就是并且的意思(两侧都为真,则为真,一侧为假则全部为假)。

3. ||  :逻辑或运算符,就是或者的意思(两则只要有一边为真,则为真,否则为假。)


4.1  逻辑取反运算符 !

我们取一个变量为flag,r如果flag为假,要做什么事情,这可以这样写:

int main()
{
	int flag = 0;
	if (!flag)
	{
		printf(" hahahahahahahha");
	}
	return 0;
}

flag为假,但!flag为真,就可以执行下面代码!


4.2  逻辑与运算符

&&就是并且的意思,&&是个双目操作符(&&两边都得有表达式例如a&&b)。只有两边都为真时表达式才真,只要有一个假,整个都是假的。

举例:

输入一个月份,判断是否为夏季:

int main()
{
	int month = 0;
	scanf("%d", &month);
	if (month > 5 && month <= 8)
	{
		printf("夏季");
	}
	
	return 0;
}

就是month得同时满足大于5下雨等于8。


4.3 逻辑或运算符

||就是逻辑或运算符,或者的意思。II也是一个双目操作符(a||b)。也就是说,符号两边表达式只要有一个真,表达式整体就是真,两边都为假时,整体才为假。

举例:

输入12月或者1月或者2月是冬天的代码:

int main()
{
	int month = 0;
	scanf("%d", &month);
	if (month ==12 ||month==1||month==2)
	{
		printf("冬季");
	}
	
	return 0;
}

4.4  闰年的判断

输入一个年份,判断是否为闰年。

判断规则(能被4整除并且不被100整除的是闰年。能被400整除的是闰年) 

法1:

int main()
{
	int year = 0;
	scanf("%d", &year);
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
	{
		printf("是闰年");

	}
	return 0;
}

法2:

int main()
{
	int year = 0;
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0) 
	{
		printf("是闰年");

	}
	else if (year%400==0)
	{ 
		printf("是闰年");
	}
	return 0;
}

4.5  短路 

C语言的逻辑运算符有一个特点,它总是从左到右求值。 

 如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。如前面的代码:

if( month > 5 && month < = 8 )

当左边代码不成立时 ,即使不判断右边的表达式,整个表达式的结果也是0。

所以,对于&&操作符来说,左边操作数的结果是0的时候,右边的不再执行。

对于||操作符是怎么样呢?我们再结合前面代码:


	if (month ==12 ||month==1||month==2)

如果month ==12,则不再用判断,整个表达式也是1。so,|| 左边操作数结果不为0是,无需执行右边的操作数。

像这种看左边知全部的,称为(“短路求值”)。

练习:

求计算结果

int main()
{
	int i = 0, a = 0, b = 2, c = 3, d = 4;
	i = a++ && ++b && d++;//需要注意前置++和后置++
	//i= a++||++b||d++
	printf("a = %d  b = %d  c = %d ", a, b, c, d);
	return 0;
}

5.  switch语句

除了if外,C语言还提供了switch来实现分支结构。

switch是一种特殊形式的if...else结构,判断有多个结果的情况。把多重的else if改成更易用的的形式。

switch (expression)
{
    case 1:haha
	case 2:haha
	default:haha
}

在上面代码中,根据表达式espression不同的值,执行相应的case分支,如果找不到对应的值,就执行default分支。

注意:switch 后的espression中必须是整形表达式且case后的值必须是常量表达式


5.1  if语句和switch语句的对比

练习:输入一个整数值,算其除2的余数

if语句完成如下

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	if (n % 2 == 0)
	{
		printf("整除,余数为0\n");
	}
	else if (n % 2 == 1)
	{
		printf("余数为1\n");
	}
	else
	{
		printf("余数为2\n");
	}
	return 0;
}

switch语句如下:

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	switch (n % 2)
	{
	case 0:
		printf("整除,余数为0\n");
		break;
	
	case 1:
		printf("余数为1\n");
		break;
		
	case 2:
		printf("余数为2\n");
		break;

	}
	return 0;
}

 注意:1.case后和数字间要有空格

            2.每一个case语句最后都有一个break,只有加上这个break,才能跳出这个switch语句。


5.2  switch语句中的break

在前面代码中去掉break会怎么样呢?

int main()
{
	int n = 0;
	scanf_s("%d", &n);
	switch (n % 2)
	{
	case 0:
		printf("整除,余数为0\n");
	case 1:
		printf("余数为1\n");
	case 2:
		printf("余数为2\n");
	}
	return 0;
}

我们可以看到,8余2应该是为0 ,但多了两行其他打印这还是为什么呢?

原因是switch是有分支效果的,只有在switch语句中使用break才可以跳出switch语句,如果一个case后面没有break则即便它成立它也会继续执行下面其它case,直到遇到break或者switch语句才结束。

所以break在switch语句中尤为重要!

当然也不是所有情况下都要加break。例如:

举例:

输入1-5,输出工作日;

输入6-7,输出休息日;

int main()
{
	int day = 0;
	scanf_s("%d", &day);
	switch (day)
	{
	  case 1:
	  case 2:
	  case 3:
	  case 4:
	  case 5:
		  printf("工作日\n");
		  break;
	  case 6:
	  case 7:
		  printf("休息日\n");
		  break;
 
	}
	return 0;
}

在上面的代码中,我们知道当多种可能的结果相同时,它们中间不要加break。所以我们要根据实际要求,来加break,才能正确的完成实际要求!


5.3  switch中的default

 在使用switch语句时,我们经常会遇到switch后的表达式中值无法匹配代码中的case语句时,无法处理的情况,这时,我们就要加上default子句

就像前面工作日的练习,如果day大于7或者小于1,如果我们此时要提出:输入错误,就可以如下完成代码:

int main()
{
	int day = 0;
	scanf_s("%d", &day);
	switch (day)
	{
	  case 1:
	  case 2:
	  case 3:
	  case 4:
	  case 5:
		  printf("工作日\n");
		  break;
	  case 6:
	  case 7:
		  printf("休息日\n");
		  break;
	  default:
		  printf("输入错误\n");
	}
	return 0;
}

 


5.4  switch语句中的case和default的循序问题

case和default字句有顺序要求吗?default只能放在最后吗?

其实在switch语句中case语句和default语句是没有顺序要求的,只要满足实际需求就可以。不过我们习惯将default放在最后处理。


6.  while循环

C语言提供了3中循环语句,while就是其中的一种,接下来介绍一下。while语句的与大结果和if非常相似。

6.1  if 和while的对比

if(表达式)
     语句;
while(表达式)
     语句;//想加上更多语句要加上大括号

 咋们再分开写出来:

int main()
{
	while (1)
		printf("hehe\n");
	return 0;
}

int main()
{
	if (1)
		printf("hehe\n");
	return 0;
}

由此观之,while拥有循环效果。


6.2  while语句的执行流程

首先上来判断表达式,表达式的值为0,循环直接结束;表达式结果不为0,则执行循环语句,语句执行完后再继续判断,是否进入下一个循环。


6.3  while循环的实践

练习1.

再屏幕上打印1-10的值

int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}


7.  for循环

7.1  语法形式  

for循环时三种循环中使用的最多的,形式如下:

for(表达式1;表达式2;表达式3)
    语句;//如果想包含更多语句,要打大括号

表达式一  用于循环变量的初始化.

表达式二 用于循环条件结束的判断

表达式三 用于循环变量的调整


7.2  for循环的执行流程

首先执行   表达式一   初始化循环变量,接下来执行  表达式二  的判断部分,表达式二的结果如果==0,则循环结束;表达式二的结果如果!=0则执行循环语句,循环语句执行完后,再去执行  表达式三  ,调整循环变量,然后再去  表达式二  的地方执行判断,表达式二的结果是否为 0,决定循环是否继续!

整个循环中,表达式一初始化部分只被执行1次,剩下的就是表达式2,循环语句,表达式三在循环。

 


7.3  for循环的实践

练习:

在屏幕上打印1-10的值

​
int mian()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d", i);
	}
	return 0;
}

​

 


7.4  while循环和for循环的对比 

​
​
int mian()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d", i);
	}
	return 0;
}

​

​
​
​
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

​

​

 

for循环和while循环都有初始化,判断,调整,这三个部分,但是for循环的三个部分非常集中,便于维护,如果代码较多则while循环三个部分就很分散,所以形式上for循环形式更优一点。 


7.5  练习

计算1-100间的3的倍数的数字和

int mian()
{
	int i = 0;
	int sum = 0;
	for (i = 3; i <= 100; i+=3)
	{
		sum = sum + 1;//sum+=1
	}
	printf("%d\n", sum);
	return 0;
}

 


 8.  do-while 循环

8.1  循环语句中do-while语句的使用最少,其语法如下:

do
   语句;
while(表达式);

while和for循环语句都是先判段后循环,do-while语句则是先进入循环后判断表达式是否为真,真的话进入下一循环,若为假则跳出循环。


8.2  do while 循环的执行流程

do while 循环中先执行语句,执行完后执行”判断表达式“,判断表达式!=0,则继续循环,执行循环语句;表达式==0,则循环结束。

所以 do while 语句中循环体至少循环一次,这是其特殊处。


8.3  do while 循环的实例

在屏幕上打印1-10的值

int main()
{
	int i = 0;
	do
	{
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);
	return 0;
}

 

一般 do while 使用在循环体至少一次的场景下,所以使用不多。


9.  break和continue 语句

在循环时,如果发生情况需要提前终止循环,这是非常常见的现象。C语言提供了break和continue两个关键字,下运用到循环中。

break  的做用是终止循环,只要break被执行,直接跳出循环,继续往后执行。

continue   的做用是跳过本次循环中continue 后面的代码,在 for 和 while循环中有所差异。


9.1  while循环中的break和continue

9.1.1  break举例

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;
		printf("%d", i);
		i = i + 1;
	}
	return 0;
}

打印了1,2,3,4后,当i ==5时,循环在break处终止,不再打印,不再循环。

所以break是终止循环时使用的。


9.2  for循环中的break和continue

9.2.1  break 举例

其实和while循环中一样,for循环中break也是用于终止循环的,只要到了break就终止。

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

 

break是真的终止循环,当我们不再想循环时,用break。

9.2.2  continue举例
int main()
{
	int i = 1;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;//跳过了后面的部分,直接来到了i++
		printf("%d", i);
	}
	return 0;
}

 

for循环中continue的做用是跳过本次循环中continue后的代码,直接去循环调整部分。


9.3  do while循环中的 dreak和continue

其与while中的基本一样,这里不再展开讲述。


10.  循环的嵌套

这三种循环都可以相互嵌套,而且通常三种嵌套在一起能更好的解决问题。

练习 

   找出100-200 之间找出素数,答应在屏幕上。

素数又称质数,只能被1和本身整除。

int main()
{
	int i = 0;
	//循环产生100-2001间的数字
	for (i == 100; i <= 200; i++)
	{
		//判断i是否为素数
		//循环产生2到i-1之间的数字
		int j = 0;
		int flag = 1;//假设i是素数
		for (i = 2; i < i; i++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%d", i);
		}
	}
	return 0;
}

11.  goto 语句

C语言内提供的一种特殊的语法,就是goto语句和跳转符号,goto可以实现在同一函数中内跳转到设置好的标号处。

例如:

int main()
{
	printf("hehe\n");
	goto next;
	printf("haha\n");

next:
	printf("跳过了haha的打印\n");
	return 0;
}

goto 语句虽然简便,但使用不当容易打乱执行流程,所以我们尽量不去用;但是goto语句也不是一无是处,在想跳出多层循环代码的情况下,十分方便(break只能跳出一层循环)。

for (......)
{
    for (.......)
    {
        for (.........)
            if (disaster)
                goto error;
    }

}
error:
.........

for循环中,一个break只能跳出一个循环,当多层循环时 goto 语句更方便。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值