分支与循环

 

目录

分支

一、分支语句结构

1. if 单分支

2. if-else 双分支

3. if-else if- else 多分支

4.switch-case 开关选择

二、注意事项

1. 悬空else

2. =与==误用

3.switch-case语句忘加break

4.switch() 的()中必须为整形表达式, case 后面必须是整形常量表达式

循环

一、循环语句结构

1. while 循环

2. for 循环

3. do-while循环

二、跳出循环语句

1.break

2.continue

3.goto

三、注意事项

1.不要在for循环内部修改循环变量,可能会导致for循环失控

2.建议for循环的循环控制变量采取前闭后开区间写法

3.for循环变种


分支

一、分支语句结构

1. if 单分支
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		printf("未成年\n");
	return 0;
}
2. if-else 双分支
int main()
{
	int age = 0;
	scanf("%d", &age);
	//if 和 else 后面只根一条语句的时候可以不用{}
	if (age < 18)
		printf("未成年\n");
	else
		printf("成年\n");
}
3. if-else if- else 多分支
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
	{
		printf("未成年\n");
	}
	else if (age >= 18 && age < 30)
	{
		printf("青年\n");
	}
	else if(age >= 30 && age < 60)
	{
		printf("中年\n");
	}
	else if (age >= 60 && age < 90)
	{
		printf("老年\n");
	}
	else
	{
		printf("老寿星\n");
	}
}
4.switch-case 开关选择

如果选择太多,用if-else就太繁琐了

switch-case语句基本格式:

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

案例1:输入1,打印星期一;输入2,打印星期二;··················输入7,打印星期日

int main()
{
	int day = 1;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一\n");
		break;
	case 2:
		printf("星期二\n");
		break;
	case 3:
		printf("星期三\n");
		break;
	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:
		printf("星期日\n");
		break; 
	default:
		printf("选择错误\n");
		break;
	}
	return 0;
}

根据实际需要,多个case是可以合并的

案例2: 输入1,2,3,4,5,输出工作日;输入6,7输出星期日

int main()
{
	int day = 0;
	scanf("%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");
		break;
	}
	return 0;
}

二、注意事项

1. 悬空else

下面代码输出结果是啥?

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

结果是什么都不打印!!! 我们会下意识认为对齐的if else匹配从而误认为这段代码输出haha, 事实上if-else 匹配规则是 : else与离他最近的未匹配的if进行匹配

我们自己在写代码时,也应该避免这种写法, 当if-else语句较多时,哪怕后面只跟一条语句,也加上{},这样就很清楚了~

2. =与==误用

if语句或者else if语句后面经常出现判断相等, 相等是 == ,容易与=混淆,从而导致逻辑错误

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

本来a和1不相等,应该什么都不打印,但是由于写成了把1赋值给a,导致if条件为真,打印hehe

因此建议数值与变量判断相等时,把数字写==左边,变量写==右边,如果不小心写成=的话会报错,因为不能将变量赋值给常量

int main()
{
	int a = 0;
	if (1 == a)
		printf("hehe\n");
	return 0;
}
3.switch-case语句忘加break

如果每个case后面没有break,那么语句会从进入的case开关一路往下执行,可能会导致逻辑错误

例如输入5,会输出星期五、星期六、星期日

int main()
{
	int day = 1;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期一\n");
	case 2:
		printf("星期二\n");
	case 3:
		printf("星期三\n");
	case 4:
		printf("星期四\n");
	case 5:
		printf("星期五\n");
	case 6:
		printf("星期六\n");
	case 7:
		printf("星期日\n");
	default:
		printf("选择错误\n");
		break;
	}
	return 0;
}
4.switch() 的()中必须为整形表达式, case 后面必须是整形常量表达式
int main()
{
	int day = 0;
	int i = 0;
	switch (day)
	{
	case 1.0: //(×)
		//
	case '2': //(√) 字符在内存中存储的是ASCII值,也属于整形家族
		//
	case i: //(×)
		//
	}
	return 0;
}

循环

循环三要素: 循环变量初值,循环条件判断,循环变量更新

一、循环语句结构

1. while 循环

while() ()内部填循环条件,{}内是循环体

int main()
{
	//屏幕上打印1~10
	int i = 1;
	while(i <= 10)
	{
		printf("%d ", i);
		i++;
	}
	return 0;
}
2. for 循环

for循环相比于while循环就是把循环三要素放在一起了,显得更加紧凑

int main()
{
	//for循环打印1~10
	int i = 0;
	for (i = 1;i <= 10;i++)
	{
		printf("%d ", i);
	}
	return 0;
}
3. do-while循环

while循环和for循环的特点是循环条件的判断次数总是比循环体的执行次数多一次, 而do-while循环的特点是循环体的执行次数和循环条件的判断次数是一样的,因为刚上来就会先执行循环体

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

二、跳出循环语句

1.break

break用于跳出当前整个循环,在三种循环结构中,他们是一样的效果

while循环:

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break; //break用于永久终止整个循环
		printf("%d ", i); //1 2 3 4
		i++;
	}
	return 0;
}

for循环

int main()
{
	//while循环和for循环中, break功能是一样的
	int i = 0;
	for (i = 1;i < 10;i++)
	{
		if (i == 5)
		{
			break;
		}
		printf("%d ", i); //1 2 3 4
	}
	return 0;
}

do-while循环

int main()
{
	//打印1~10
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);// 1 2 3 4
		i++;
	} while (i <= 10); 
	return 0;
}
2.continue

continue用于跳出本次循环,进入下次循环

注意区分在不同循环结构中,continue起到的作用的差异

while循环

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue; //continue用于跳过本次循环,直接进入下次循环
		printf("%d ", i); //1 2 3 4 死循环
		i++;
	}
	return 0;
}

由于continue跳过后面的代码,因此再也没有机会执行i++了,因此死循环

for循环

int main()
{
	int i = 0;
	for (i = 1;i < 10;i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i); //1 2 3 4 6 7 8 9
	}
	return 0;
}

for循环的循环变量的更新在for()括号里面,因此conytinue跳过本次循环, i会更新,进入下次循环

do-while循环

int main()
{
	//打印1~10
	int i = 1;
	do
	{
		if (i == 5)
			continue;
		printf("%d ", i); //1 2 3 4 死循环
		i++;
	} while (i <= 10); 
	return 0;
}
3.goto

有时for循环可能嵌套了很多,而break只能跳出当前for循环,因此每个for循环都需要一个break才能调到最外面, 而goto语句可以跳转到任意一个位置

举个简单栗子

int main()
{
again:
	printf("hehe\n");
	printf("haha\n");
	printf("heihei\n");
	goto again;
	return 0;
}

代码运行结果是会死循环打印这三条语句

三、注意事项

1.不要在for循环内部修改循环变量,可能会导致for循环失控

以下代码导致死循环

int main()
{
	int i = 0;
	for (i = 1;i <= 100;i++)
	{
		//业务处理
		i = 0;
	}
	return 0;
}
2.建议for循环的循环控制变量采取前闭后开区间写法
int main()
{
	int i = 0; //[0, 10)
	//for (i = 0;i <= 9;i++) 不建议这样写
	for (i = 0;i < 10;i++) //10是有意义的,打印10个数
	{
		i = 0;
	}
	return 0;
}
3.for循环变种

①省略for循环三要素的某一个或多个

1)不要省略条件判断,省略了意味条件恒为真,会导致死循环

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

2)省略其他部分可能会导致结果错误

本意是打印9个hehe, 但结果只打印了3个hehe(因为外面for进入第二次循环时,j没有归0,内层for不再执行,第三次也一样)

int main()
{
	int i = 0;
	int j = 0;
	for (i = 0;i < 3;i++)
	{
		for (j = 0;j < 3;j++)
		{
			printf("hehe\n");
		}
	}
	return 0;
}

②多个循环变量构成的循环控制语句

int main()
{
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n"); //打印两个hehe
	}
	return 0;
}

你可能感兴趣的:(github,git)