选择语句、循环语句(一)

本文介绍了C语言中的if-else、switch、while和for等控制结构,包括语法、逻辑错误案例及良好代码风格的实践。通过实例演示了如何避免逻辑混淆和提高代码可读性。

C语言是结构化的程序设计语言

分支语句----选择结构

1.if语句

2.switch

循环语句

1.while

2.for

3.do while

C语言中由一个分号;隔开的就是一条语句;

if语句

if(表达式)
     语句;
if(表达式)
     语句1else
     语句2
if(表达式)
     语句1else if
     语句2else
	 语句3

代码演示:

#include <stdio.h>
int main()
{
	int a = 10;
	if (a >= 18)
		printf("成年人\n");
	else
		printf("未成年\n");
	return 0;
}

逻辑错误代码示例:

int a;
	printf("请输入年龄:\n");
	scanf("%d", &a);
	if (a < 18)
		printf("未成年\n");
	else if (18 < a < 60)  //会出现逻辑错误(18 < a)是正确的,值为1
		printf("中年人\n");
	else
		printf("老年人\n");
	return 0;

在这里插入图片描述

这样修正就行了,&&是逻辑与;

else if (a >= 18 && a < 60)

注意:else不是必须存在的;

else悬空:

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

应该是这样的:

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

else是跟上面最近的一个if匹配的;—但是可以通过花括号标明匹配关系

形成良好的代码风格:—空格、花括号、命名、缩进

不同代码风格演示:

//代码one
if(condition)
{
	return x;
}
return y;
//代码two
if(condition)
{
	return x;
}
else
{
	return y;
}

这两种代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int test1()
{
	if (1)
	{
		return 1;
	}
	return 2;
}
int test3()
{
	if (1)
	{
		return 11;
	}
	else
	{
		return 22;
	}
}
int main()
{
	
	test1();  //单纯执行并不输出
	printf("%d\n", test1());
	//printf("%d\n", test2());
	printf("%d\n", test3());
	return 0;
}

在这里插入图片描述

事实证明这两种代码事实是一样的,第二种风格好;

补充:

int test1()
{
	if (1)
	{
		return 1;
	}
	return 2;
	return 3;
}
int test3()
{
	if (1)
	{
		return 11;
	}
	else
	{
		return 22;
		return 33;
	}

这样也是一样的,不只是第一行!!
在这里插入图片描述

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////遇到的问题:

1.代码如下

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int test2()
{
	if (1)
	{
		printf("1\t");
	}
	return 0;
}
int main()
{
	printf("%d\n", test2());
	return 0;
}

结果是:
在这里插入图片描述

2.如果代码是:

int test2()
{
	if (1)
	{
		printf("1\t");
	}
	printf("2\n");
	return 0;
}

结果是:
在这里插入图片描述
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

一种良好的代码风格:

if(num==5)
//如果上面这个形式少写一个=号,if里面永远是真,找不出来错误
if(5==num)
//如果这个少写一个=号,编译器错误,因为左操作数必须为左值,左边那个数不能被改

小练习:输出1-100之间奇数

思路:先产生1-100之间的数,然后判断是否为奇数,再决定是否输出;

int i ;
	for (i = 1; i <= 100; i++)
	{
		if (1 == i % 2)
		{
			printf("%d\n", i);
		}
	}
for (int i = 1; i <= 100; i += 2)
	{
		printf("%d\t", i);
	}
	return 0;
int i = 1;
		while (i <= 100)
		{
			printf("%d\t", i);
			i = i + 2;
		}
	return 0;

注意点:i+=2///////////while //////

switch语句

switch语句也是一种分支语句,往往用于多分支的情况;

switch(整型表达式)
{
	///语句项;
	//case 整型常量表达式:
	case 1:语句;
	case 2:语句:
	...
	case n:语句
}

代码示例如下:

    int m=0;      //只能是整型,不可以是浮点型
	printf("请输入数字:\n");
	scanf("%d", &m);   //不能写n=1,因为n是变量
	switch (m)
	{
	case 1:            //case  后面可以是1+0,是常量表达式就可以
		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;
	}
	return 0;
}

break不是一定要加上,只要逻辑不错就行;

int m = 0;
	printf("请输入数字:\n");
	scanf("%d", &m);
	switch (m)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;
	}
	return 0;

结果是这样的:可以滑下去,但是如果有break的话,直接退出switch选择语句了;

在这里插入图片描述
写代码的一个好习惯:最后一个case语句要加上break(防止混叠);

出错提示代码如下:

default:   //默认值
	printf("error!\n");
	break;

注意:switch语句允许嵌套使用;

if语句

当if语句后面的条件成立时,执行后面的语句,但是只执行一次;

while语句

while(表达式) //表达式成立时,执行循环语句
{
	循环语句;
}

在while语句中,break用于永久的终止循环;

int a = 1;
	while (a <= 10)
	{
		printf("%d ", a);
		if (a == 6)
		{
			break;
		}
		a += 1; //如果没有这个语句,a的值不会增加死循环了
	}

在while循环中,continue的作用是跳过本次循环continue后面的部分,来到判断部分;

分析一段死循环的代码:

int m = 1;
	while (m <= 10)
	{
		printf("%d", m);
	
		if (m == 5);     //逻辑错误
		{
		continue;
		}
		m++;
		
	}
	return 0;

问题出现在哪里呢?-------出现在if()后面有一个分号;

示例:如果想输出除了6的1-10之间的数—合理运用continue、break;

//如果想输出除了6的1-10之间的数
	int i = 1;
	while (i <= 10)
	{
	
		if (i == 6)
		{
			i++;
			continue;
		}
		printf("%d ", i);
		i += 1;
	}
	return 0;

分析几个代码:

getchar:这个函数从键盘读取一个字符,返回一个整型类型的值(ASCII值),如果输入错误或者文件结束条件,则返回一个EOF(end of file);

putchar:输出一个字符;

示例:从键盘上读取一个字符,然后输出该字符;

int ch = 0;
	while ((ch = getchar()) != EOF)   //if也可以,但是只能读取一次,读取一个字符
	{
		printf("%c  ", ch);
		putchar(ch);
	}

	return 0;

作用:不断从键盘上读取字符并输出;

Ctrl+Z时,停止读取字符;

注意:getchar从键盘读取字符,并不是直接读取的,中间有一个缓冲区;

当输入H并敲击回车键后,缓冲区的内容是H\n,getchar首先读取H,并输出,再接着读取\n,会有一

个换行的效果,所以也是可以连续输入多个字符的,并不是直接读取字符串;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hskwcy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值