【Shp的C语言小厨房】语句篇


前言

  哈喽哈喽!这里是Shp的C语言小厨房,不论新老朋友,不论基础如何,希望你们可以好好品尝,或多或少学到些什么,就算是不负我烹饪这道菜了。
  在上一节中我们讲到了常量、字符串等等
  不清楚上一节讲了什么的小伙伴可以戳这
  初识C语言2.0(这绝不是打广告)
  那么今天呢我们继续往下看,今天我们要探讨的是C语言当中的语句,请客官稍等片刻,我这就开始上菜


开胃小菜来咯

一、空语句

  空语句,见词会意,就是空的语句嘛。为什么先讲它呢,因为它是C语言里面最简单的语句,它本身只包含一个分号
看代码示例

#include <stdio.h>

int main()
{
	int x = 10;
	while (x>0)
	{
		;//这就是一段空语句
	}
	return 0;
}

空语句本身并不执行任何任务,当C语言语法要求出现一条完整的语句,但并不需要它执行任何任务,此时,空语句就派上用场啦

现在才是正餐,请客官慢慢享用

二、选择语句

1.if 语句

C语言的if语句语法如下

if (expression)//括号是if语句的一部分,必须出现,末尾不要加分号
{			   //expression为表达式
	statement 1//statement表示代码块
}	
else
{
	statement 2
}

  如果statement里只有一条语句,那么花括号{ }可加可不加,而如果statement里不止一条语句,而你又恰巧没加花括号,那么这时候代码输出的结果可能不是你所期望的结果,所以许多程序员倾向于在任何时候都添加花括号以避免这种错误

if语句的执行过程如下,其中expression的结果为0则为假,非0则为真
在这里插入图片描述
来看具体的代码示例吧

#include <stdio.h>

int main()
{
	int x = 10;
	if (x >= 10)
	{
		printf("好offer");
	}
	else
	{
		printf("卖红薯");
	}
	return 0;
}

附上运行结果,和你想得一样吗
在这里插入图片描述
如果不止两条支路,有三条、四条支路呢,这时只需要像这样

if (expression)//括号是if语句的一部分,必须出现,末尾不要加分号
{			   //expression为表达式
	statement 1//statement表示代码块
}	
else if (expression)
{
	statement 2
}
else if (expression)
{
	statement 3
}
……
else
{
	statement n
}

诺,就像这样,具体运用如下,输入成绩程序就可以进行判断啦

//输入学生成绩加以判断
#include <stdio.h>

int main()
{
	int i = 0;
	scanf("%d", &i);
	if (i >= 90)
	{
		printf("优秀");
	}
	else if(i >= 80)    //括号里你也可以写成i>=80 && i<90,我不这样写的原因是	
	{				    //if语句括号里的条件为真的话,程序就输出对应结果并且不再向下进行了
		printf("良好"); //为假的话则要继续向下判断
	}
	else if (i >= 60)
	{
		printf("及格");
	}
	else
	{
		printf("不及格");
	}
	return 0;
}

"悬空的else"问题

这里,我们稍微来拓展一下,一般我们认为一个if对应一个else不是吗,那么当if语句嵌套出现时,就会出现“悬空的else”问题,来看具体例子

if (i > 1) //1
	  if (j > 2) //2
			printf("i>1 and j>2\n");
  else
		  printf("no they are not\n");

我们并不关心代码的运行结果是什么,我问一句,你认为else子句从属于哪一个if语句呢?是第1个呢,还是第2个?

3,2,1,好的,揭晓答案,else子句从属于最靠近它的不完整的if语句,在该题中,else语句就从属于第2个if语句

怎么样,以上代码的风格是不是很差,代码是要给人看的,一个好的程序员要会站
在别人的角度考虑问题

如果我想要else子句从属于第1个if语句的话,只需要像这样就行了

if (i > 1)
{
	if (j > 2)
	{
		printf("i>1 and j>2\n");
	}
}
else
{
	printf("no they are not\n");
}

怎么样,是不是清楚多了
那么看到这,你对if语句的理解是不是更深了呢
消化一下,我马上来上第二道菜

2.switch 语句

C语言的switch语句语法如下,常用于多分支语句

switch (expression)//expression表示表达式,其结果必须为整型值
{
case constant—expression://constant—expression表示常量表达式,它不能是任何变量
	statement 1//statement表示代码块,以下均是
		break;//break语句
case constant—expression:
	statement 2
		break;
case constant—expression:
	statement 3
		break;
……
case constant—expression:
	statement n
		break;
}

switch语句的执行过程:先计算expression的值,然后,程序跳转到语句列表中case标签值与expression的值相匹配的语句,从这条语句起,直到语句列表的结束也就是switch语句的底部,它们之间的语句均被执行
图解如下
在这里插入图片描述

switch语句中的break语句

如果在switch语句的执行过程中遇到了break语句,程序就会立即跳到语句列表的末尾,事实上在所有的switch语句中,几乎所有的case后面都会跟上一句break
让我们从一段代码中来进一步理解

//输入一个值,输出对应的星期
#include <stdio.h>

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

以上就是switch语句的经典列子,比如我们输入3的话,程序就会打印星期三,但是如果我们删去全部的break,再次输入3的话,程序就会依次打印星期三、星期四……星期天,大家可以复制代码到自己的编译器里去试试哦

我们习惯上在最后一个case的语句后面加上一条break语句,尽管加与不加在代码运行时并没有什么区别,但是为了以后维护方便,我们最好加上,这样如果你以后决定在这个switch语句中再添加一个case,就可以避免出现在以前的最后一个case语句后面忘记添加break语句这个情况

如果你想在输入1、2、3、4、5时输出weekday,输入6、7时输出weekend时该怎么办,请小伙伴们先思考思考
我们可以像这样暴力求解

//输入1、2、3、4、5时输出weekday,输入6、7时输出weekend
#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch(day)
	{
	case 1:
		printf("weekday\n");
		break;//终止打印
	case 2:
		printf("weekday\n");
		break;
	case 3:
		printf("weekday\n");
		break;
	case 4:
		printf("weekday\n");
		break;
	case 5:
		printf("weekday\n");
		break;
	case 6:
		printf("weekend\n");
		break;
	case 7:
		printf("weekend\n");
		break;
	}
	return 0;
}

但是,我们一般这样编写代码,以下代码的执行过程没有任何问题,在缺少break语句的情况下,case语句将依次被执行,直到遇到break跳出语句

//输入1、2、3、4、5时输出weekday,输入6、7时输出weekend
#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch(day)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;
	}
	return 0;
}

default 子句

在上面的代码中,你可能会想如果表达式的值与所有的case标签的值都不匹配怎么办?比如在上面的代码中我输入一个8,但是没有case 8呀,其实没有什么错,就是所有语句都被跳过而已,也就是什么都不会打印,大家可以复制代码自己运行试试

我们编写这样一条代码,如果用户输入8,我们就提示他请输入1~7之间的数字,这时候就要用到default子句,代码如下

#include <stdio.h>

int main()
{
	int day = 0;
	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("请输入1-7之间的数字\n");
		break;
	}
	return 0;
}

当表达式的值与所有的case标签的值都不匹配时,default子句后面的语句就会执行

注意:每个switch语句只能出现一条default子句
   default子句可以出现在语句列表的任何位置

接下来可是主食哦,细品哦客官

三、循环语句

1. while 语句

C语言的while语句语法如下

while (expression)//expression表示表达式,其值为0则为假,其值非0则为真
{
	statement//statement表示代码块
}

while语句的执行过程
在这里插入图片描述
图中,break语句用于永久终止循环,也就是跳出break语句所在的循环。continue语句用于永久终止当前的那次循环,也就是跳过一次循环,直接去判断部分进行是否继续循环的判断

值得注意的是这两条语句的任何一条如果出现于嵌套的循环内部,那么它只对最内层的循环起作用,也就是你无法通过它影响外层循环的执行

来写一段while语句的代码吧

//打印1-100以内3的倍数
#include <stdio.h>

int main()
{
	int i = 1;
	while (i <= 100)//while循环
	{
		if (i % 3 == 0)
		{
			printf("%d ", i);
		}
		i++;
	}
	return 0;
}

while语句+continue语句代码演示

//只打印数字字符
#include <stdio.h>

int main()
{
	char ch = 0;
	while ((ch = getchar()) != EOF)//此语句用于多组输入	EOF - end of file
	{								
		if (ch < '0' || ch>'9')//判断ch是否为字母,是返回非0,不是返回0
		{
			continue;//若输入为字母则执行continue,跳过此次循环,不继续执行下面的语
		}			 //直接进行下一次判断
		putchar(ch);
	}
	return 0;
}

while语句+break语句代码演示

//如果输入为负值,程序结束
#include <stdio.h>

int main()
{
	float value = 0;
	while (scanf("%f", &value) == 1)//scanf的返回值为1,1 == 1,进入循环
	{
		if (value < 0)//负数小于0,表达式为真,则执行break终止循环
		{
			break;
		}
	}
	return 0;
}

2.for 语句

C语言的for语句语法如下

for (expression1; expression2; expression3)//expression表示表达式
{
	statement//statement表示代码块,是for语句中的循环体
}

其中,expression1为初始化部分,只在循环开始时执行一次,expression2为条件部分,它在循环体每次执行前都要执行一次,expression3为调整部分,它在循环体每次执行完毕,在条件部分即将执行之前执行

所有三个表达式都是可选的,都可以省略,如果省略条件部分,则表达式的结果始终为真

在for循环里也可以使用continue语句和break语句,而且continue语句把程序直接转移到调整部分

for语句的执行过程
在这里插入图片描述
用一段for循环代码来加以理解吧

//打印1-100以内3的倍数(for循环版本)
#include <stdio.h>

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

我们会发现for循环与while循环非常类似,观察它们的执行过程,会发现它们的区别在于continue语句。

在for语句中,continue语句跳过循环体的剩余部分,直接回到调整部分,而在while语句中,调整部分是循环体的一部分,所以continue也会跳过它

for循环相较于while循环在风格上有优势,for循环的所有用于操纵循环的表达式是放在一起的(位于括号内),便于寻找,这样当循环体比较大时你可以更加快速的确定循环是如何进行的

我个人最喜欢的就是for语句了,嘿嘿

3.do while 语句

C语言的do while语句语法如下

do
{
	statement//statement表示代码块,是do while语句中的循环体
}while (expression);//expression表示表达式,注意语法,末尾要加分号

do while语句的执行过程
在这里插入图片描述
别看它的执行过程歪七扭八,但实际用起来和while语句差不多,最大的区别就是do while循环的循环体至少执行一次,所以,当你想要循环体至少执行一次时,选择do
while语句

看一段代码加深理解

//打印8个A
#include <stdio.h>

int main()
{
	int column = 0;
	do
	{
		column += 1;
		putchar('A');
	} while (column % 8 != 0);
	return 0;
}

主菜上完了以后,不如来点小甜点吧!

四、goto 语句

C语言的goto语句语法如下

goto 语句标签;

使用goto语句时,你必须在你想要跳转的语句前面加上语句标签,语句标签就是标识符后面加个冒号,包含这些标签的goto语句可以出现在同一个函数的任何位置

用代码来理解

//陷入打印hehehaha的死循环
#include <stdio.h>

int main()
{
flag:
	printf("hehe");
	printf("haha");
	goto flag;//回到句首flag
	return 0;
}
//goto语句不常用,不能再两个函数之间跳跃,与break相比能跳出更多的循环

在一种情况下使用goto语句非常适合,那就是跳出多层嵌套的循环,因为break语句只能跳出包围它的最内层循环,如下面这种情况

while (expression1)
{
	while (expression2)
	{
		while (expression3)
		{
			if (expression4)
			{
				goto quit;
			}
		}
	}
}
quit: ;

goto语句是一种危险的语句,因为在学习C的过程中,很容易形成对它的依赖
                                ——《C和指针》

用goto语句写出来的程序总是难以维护的多,一般情况下,我们应该避免使用goto语句

今日份心灵鸡汤

人生的每一笔经历,都在书写你的简历。原本你以为微不足道的事情,回头看的时候,都有着无法细数的刻度。自己拼出来的东西,和别人送到嘴边的东西,意义和珍惜的程度都大为不同。

希望大家在忙碌的生活中能够暂且停下脚步,休憩片刻,C语言小厨房欢迎大家光临

我试着改变了自己的博客风格,希望你们能够喜欢,好嘞,客官慢走,欢迎下次光临

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Shining-point

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

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

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

打赏作者

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

抵扣说明:

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

余额充值