C语言学习笔记(五)

现实生活中无非就三种结构

  • 顺序结构
  • 选择结构
  • 循环结构

分支和循环(一)_C语言

分支语句:

  • if else 语句
  • switch 语句

循环语句:

  • while 循环语句
  • for 循环语句
  • do while 循环语句

什么是语句

由一个;(分号)隔开的叫语句

int a = 0;
return 0;
;
//这些都是语句(甚至只有一个分号也叫语句)

 

一、分支语句

【1】if分支语句

          if分支语句有单分支语句、双分支语句、多分支语句

①单分支语句:

     if(表达式)

          语句;

分支和循环(一)_C语言学习笔记_02

int a = 10;
if(a < 11)
  printf("哈哈\n");

//表达式为真打印“哈哈”,表达式为假不打印

②双分支语句:

     if(表达式)

          语句1;

     else

          语句2;

分支和循环(一)_C语言_03

int a = 10;
if(a < 11)
  printf("哈哈\n");
else
  printf("呵呵\n");

//表达式为真执行语句1,打印哈哈;表达式为假执行语句2,打印呵呵

③多分支语句:

     if(表达式1)

          语句1;

     else if(表达式2)

          语句2;

     else

          语句3;

分支和循环(一)_C语言学习笔记_04

int age = 10;
if(age < 18)
	printf("未成年\n");
else if(age > 18 && age < 50)
	printf("壮年\n");
else
	printf("老年\n");

//表达式1为真执行语句1;表达式1为假,执行表达式2,表达式2为真打印语句2;表达式2为假执行语句3

【拓展①】

int age = 10;
if(18 < age < 50)
	printf("壮年\n");
else
	printf("未成年\n");

age明明小于18,结果却输出壮年,原因就出在 18 < age < 50 这里,这种写法是错误的,虽然在语法上没问题,18 < 10 不成立结果为假,值为 0,0 < 50 结果为真,表达式成立,打印壮年,这就是代码的执行过程,正确的写法应该是:age > 18 && age < 50

if语句还可以用嵌套式的写法,例如:

int age = 49;
if(age < 18)
	printf("未成年\n");
else
{
	if(age > 18 && age < 50)
		printf("壮年\n");
	else
		printf("老年\n");
}

【拓展②】

关于if语句使用 {} 的问题

如果条件为真(假),要执行多条语句则需要加 {} ,否则不需要

int a = 10;
if(a < 18)
	printf("未成年\n");

//这里条件为真,只执行一条语句,所以可以不加 {}

int a = 10;
if(a < 18)
{
	printf("未成年\n");
	printf("不可以抽烟\n");
}

//这种情况就需要加 {}

 

【1.1】悬空else

分支和循环(一)_分支和循环_05分支和循环(一)_C语言学习笔记_06

这两个种情况打印的结果都是什么也没有,为什么会是这种结果,难道不是先执行第一条 if 语句,因为 a = 0;故不等于 1,条件为假,不执行第二条if语句,直接执行 else,打印 haha 吗?

分支和循环(一)_C语言_07

当然不是这样的,正确的分析结果:我们要明白一个知识点,else 与离它最近的且为匹配的 if 进行匹配,由代码可知离 else 最近的就是第二条 if 语句了,且为匹配,所以第一条 if 语句条件如果为假,那就什么都不执行了,直到条件为真才执行第二条 if 语句。

结论:else 与离它最近的且为匹配的if进行匹配

其实造成第一种错误分析的原因是代码不规范。如何使 else 与第一条 if 语句匹配呢?

int a = 0;
int b = 2;
if(a == 1)
{
	if(b == 2)
		printf("hehe\n");
}
else
	printf("haha\n");

运行结果:haha

 

【1.2】if 书写形式对比

代码一

if(condition){
	return x;
}
return y;

代码二

if(condition)
{
	return x;
}
else
{
	return y;
}
  • 分析代码一:如果条件成立,返回 x ,return y 不被执行,只有条件为假的时候才会返回 y ,很多人会认为无论条件是否成立,都会返回 y ,这是错误的,注意是 return 而不是其它语句,执行 return 就返回了,不再执行其它语句了。
  • 分析代码二:如果条件为真,返回 x ,条件为假,返回 y 。

结论:代码一和代码二就提现了代码书写不规范所带来的问题,会影响读者理解代码的意思 

【拓展①】

代码一

int a = 10;
if(a = 20)
{
	printf("haha\n");
}

运行结果:哈哈

代码二

int a = 10;
if(a == 20)
{
	printf("haha\n");
}

运行结果:

= 是赋值,在代码一中 a = 20,是改变了 a 的值,不管值为多少,条件都是成立的,haha一定会被打印,而代码二中的 == 是判断相等,10 != 20,条件为假,haha不会被打印;这种错误并非语法上的错误,编译器是不会报错了,所以如果是在写显目,不小心写成这种情况,是很难发现的。这里提供一种方法来解决这个问题。

int a = 10;
if(20 == a)
{
	printf("haha\n");
}

//如果写成 if(20 = a) 那编译器就会报错了,这就很好的避免了上述问题

 

【2、】switch分支语句

分支和循环(一)_C语言_08

//语法
switch(整型表达式)
{
	语句项:
}

//语句项
case 整型常量表达式:
	语句;
  • 整型表达式:必须是整型
  • 整型常量表达式:产生的结果必须是整型
int a;
switch(a)
{
	case 1+0 :
		printf("haha\n");
}

//这是都是正确的
int a = 0;
int n = 1;
scanf("%d",&a);
switch(a)
{
	case n :
		printf("星期一");
		break;
}

//这种写法是错误的,语法要求 n 所在的那个位置必须为整型且为常量表达式,但是 n 是变量,所以会报错

 

分析代码:

int a = 0;
scanf("%d",&a);
switch(a)
{
	case 1:
		printf("星期一");
		break;
	case 2:
		printf("星期二");
		break;
}

分析:根据 a 的值,找到对应的地方,比如输入 2 ,a 的值为 2 ,就执行 case 2:的代码,打印星期二,接着执行 break;语句跳出循环。break是跳出switch循环

  • case决定入口
  • break决定出口

 

【default子句】

如果输入的结果在 case 中找不到对应的入口,程序就什么也不输出,我们可以加上 default 来解决这个问题,如果输入的结果在 case 中找不到对应的入口,那就执行 default 子句,打印错误提示信息

int a = 0;
scanf("%d",&a);
switch(a)
{
	case 1:
		printf("星期一");
		break;
	case 2:
		printf("星期二");
		break;
	case 3:
		printf("星期三");
		break;
	default:
		printf("输入错误");
		break;
}

运行结果:
输入:4
输入错误

输入:1
星期一

【拓展①】

default 子句只能放在 switch 语句的结尾吗?

分支和循环(一)_C语言学习笔记_09

当然不是的,在C语言中没有明确规定 default 子句的位置,所以 default 子句的位置可以随意放,只不过不建议这么写

分支和循环(一)_C语言学习笔记_10分支和循环(一)_C语言学习笔记_11