c语言初阶

我前面发表过的《初始c语言》系列文章是对c语言有大概的认识,现在进入了一个全新的阶段,在这个阶段,将对C语言有更深层次的认识,当然,因为C语言编程是一门实践性的学科,所以一定要多练,在文章中,我都会通过举例的形式,去加深对知识点的理解。

本文大纲

分支语句

  • if
  • switch

以及对应的一些题目解析

1. 什么是语句

C 语句可分为以下五类:
  1. 表达式语句
  2. 函数调用语句
  3. 控制语句
  4. 复合语句
  5. 空语句

本文主要介绍的是控制语句

控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语言有九种控制语句
可分成以下三类
  •  条件判断语句也叫分支语句if语句、switch语句;
  • .循环执行语句也叫循环语句do while语句、while语句、for语句;
  •  转向语句:break语句、goto语句、continue语句、return语句。

2.分支语句(选择结构)

做分支也就是在做选择,《初始c语言》中简单介绍过选择结构,就是将生活中的选择问题转化为代码的表达

(分支语句)选择结构中有:if语句、switch语句下面介绍以下它们的用法

2.1 if 语句

2.1.1 简单应用(单分支)

语法结构可以分为:

if (表达式)

        语句;

这种是就基本的一种,表示的意思是:如果表达式为真(c语言中规定0为假,非0为真)就会执行语句,一般来说很少会单独用 if,但也举个简单的例子:

#include <stdio.h>

int main()
{
	int age = 10;
	if(age>18)
	{
		printf("成年\n");
	}
	if (age == 10)
	{
		printf("未成年\n");
	}
	return 0;

}

  if (表达式)

        语句1;

else 

        语句2;

如果表达式为真,语句1就要被执行

如果表达式为假,语句2就要被执行(就是如果……否则的意思)

这是比较常用的一种类型,下面举个例子:

#include <stdio.h>

int main()
{
	int age = 10;
	if (age > 18)
	{
		printf("成年\n");
	}
	else
	{
		printf("未成年\n");
	}
	return 0;

}
2.1.2 代码风格的重要性

特别注意

 If 和else语句只跟一条语句就不用加大括号{ },因为不加大括号,if或者else都只能识别一条语句,跟多条语句就一定要加大括号,建议:无论一条或者是多条语句都加上大括号{ },下面就举个例子来说明一下代码规范的重要性 :

先猜一下下面的代码的输出是什么?

说明:else匹配规则:else是和它离得最近的if匹配的,就是把红框看作一组(不会因为和谁对齐而看成与它是一组),所以不会打印出任何东西

所以应该如何改正呢?下面给出改正后的代码:

#include <stdio.h>

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

if的书写形式的对比,再来看一下,下面这个例子:想一下输出是多少

#include <stdio.h>

int test()
{
	int a = 4;
	if (a == 4)
		return 1;
	return 0;
}
int main()
{
	int r = test();
	printf("%d\n",r);
	return 0;
}

对比于上面的代码,下面给出另一种书写:对比一下那种更有阅读性呢?

#include <stdio.h>

int test()
{
	int a = 4;
	if (a == 3)
		return 1;
	else
	return 0;
}
int main()
{
	int r = test();
	printf("%d\n", r);
	return 0;
}

再给个例子(这个凭个人习惯):

#include <stdio.h>

//if的书写形式的对比例二
int main()
{
	int num = 3;
	if (5 == num)//相当于if(num ==5),这个漏一个等号会报错,将变量赋值给常量是错误的
		printf("haha\n");
	return 0;
}

所以代码风格是很重要的,想要加强代码风格可以去看一下《高质量C++/C编程指南(李锐)》

2.1.3 多分支结构

if (表达式1)

        语句1;

else if (表达式2)

        语句2;

else 

        语句3;//注意:分支结束的时候一定要用else结尾

以上语句同理,先判断表达式1是否为真,如果为真,就执行语句1,如果表达式1为假,就再判断表达式2是否真,如果为真,就执行语句2,如果所有 if 和else if都中的判断表达式都为假,就执行else中的语句3.

下面举个例子:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int age = 10;
	scanf("%d",&age);

	if (age < 18)
	{
		printf("青少年\n");
	}
	else if (age >= 18 && age < 28)
	{
		printf("青年\n");
	}
	else if(age >= 28 && age < 40)
	{
		printf("中年\n");
	}
	else if (age >= 40 && age < 60)
	{
		printf("壮年\n");
	}
	else if (age >= 60 && age < 100)
	{
		printf("老年\n");
	}
	else
	{
		printf("老寿星\n");
	}
	return  0;
}
2.1.3 练习

下面举一些例子,让大家对if 语句更加深刻。

练习1、写一段程序,输入一个整数,判断它是否为奇数

答案:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int a;
	printf("输入一个整数:");
	scanf("%d",&a);
	if (a % 2)//或者if(a % 2 == 1)
	{
		printf("这个数是奇数");
	}
	else
	{
		printf("这个数是偶数");
	}
	return 0;
}

练习2、输出1-100之间的奇数

答案:

  • #include <stdio.h>
    
    int main()
    {
    	int a = 1;
    	while (a < 100)
    	{
    		if (a % 2)//或者if(a % 2 == 1)
    		{
    			printf("%d ", a);
    		}
    		a++;
    	}
    	return 0;
    }

2.2 switch语句

switch也是一种分支结构,常用于多分支,虽然if else也可以写多分支,但过于复杂

比如:要求我们按照输入,来选择输出

输入1,输出星期一

输入2,输出星期二

输入3,输出星期三

输入4,输出星期四

输入5,输出星期五

输入6,输出星期六

输入7,输出星期日

如果用 if else 语句实现:

#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	if (1 == day)
		printf("星期一\n");
	if (2 == day)
		printf("星期二\n");
	if (3 == day)
		printf("星期三\n");
	if (4 == day)
		printf("星期四\n");
	if (5 == day)
		printf("星期五\n");
	if (6 == day)
		printf("星期六\n");
	if (7 == day)
		printf("星期日\n");
	else
		printf("请输入正确的数字");

	return 0;
}

if 语句的形式可能会太复杂,那我们就有了不一样的语法形式

这就是switch语句

switch(整型表达式)

{

        case 整型常量表达式

                语句;  

}

2.2.1 在switch语句中的break

在switch语句中,我们没办法直接实现分支,要搭配break使用才能实现真正的分支

比如:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d",&day);
	switch (day)//注意switch中的数据类型必须要整型
	{
	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;
}

如果在case下不加break,就会按顺序的执行case,直到遇到break或者程序结束。

比如:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//在比如只需要判断工作日或者是周末
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)//注意switch中的数据类型必须要整型
	{
	case 1://可以不加break,不跳出,继续循环下面的语句
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;//最后一个break可以不加,不加也是因为结束跳出,但建议加上
//	default:
//		printf("选择错误\n");
//		break;
	}
	return 0;
}

这个例子就会发现,输入1-5的时候,就会按顺序执行到case 5 ,遇到break后退出,如果觉得不明显可以用调试(vs2019按F10,就能看到程序运行的步骤)

正式break的这个特性,使我们代码实现把语句列表划分为不同的分支部分,运用起来更加灵活。

2.2.2 default 子句
如果表达的值与所有的 case 标签的值都不匹配怎么办?
其实也没什么,结构就是所有的语句都被跳过而已。
程序并不会终止,也不会报错,因为这种情况在 C 中并不认为是个错误。
但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条 default 子句,把下面的标签
default
写在任何一个 case 标签可以出现的位置。
switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行
所以,每个 switch 语句中只能出现一条 default 子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。

用上面的例子加入default 改进后:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

//在比如只需要判断工作日或者是周末
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)//注意switch中的数据类型必须要整型
	{
	case 1://可以不加break,不跳出,继续循环下面的语句
	case 2:
	case 3:
	case 4:
	case 5:
		printf("weekday\n");
		break;
	case 6:
	case 7:
		printf("weekend\n");
		break;//最后一个break可以不加,不加也是因为结束跳出,但建议加上
	default:
		printf("选择错误\n");
		break;
	}
	return 0;
}

说明:上面的程序,输入1-7以外的值时就会输出选择错误

2.2.3 练习

为了巩固switch,下面一个题目,非常经典

阅读以下代码,写出输出。

#include <stdio.h>

int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:m++;
	case 2:n++;
	case 3:
		switch (n)
		{
			//switch允许嵌套使用
		case 1:n++;
		case 2:m++; n++;
			break;//只会跳出当前的switch语句
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n",m,n);
	return 0;
}

答案为:m = 5,n = 3

下一篇将介绍循环语句的相关知识

相关推荐

  1. C语言测试

    2024-01-28 11:04:01       47 阅读
  2. C语言--指针

    2024-01-28 11:04:01       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-28 11:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-28 11:04:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-28 11:04:01       82 阅读
  4. Python语言-面向对象

    2024-01-28 11:04:01       91 阅读

热门阅读

  1. Springboot多数据源连接

    2024-01-28 11:04:01       70 阅读
  2. ValueConverters.NET

    2024-01-28 11:04:01       53 阅读
  3. 初识Cargo-Rust的包管理器

    2024-01-28 11:04:01       59 阅读
  4. 轻松将Word文档转换为PDF:R语言实战教程

    2024-01-28 11:04:01       59 阅读
  5. 面试 HTML 框架八股文十问十答第一期

    2024-01-28 11:04:01       70 阅读
  6. 300. 最长递增子序列(动态规划)

    2024-01-28 11:04:01       59 阅读
  7. 关系运算和逻辑运算

    2024-01-28 11:04:01       50 阅读
  8. 1.27学习总结

    2024-01-28 11:04:01       45 阅读
  9. 第八章 对象、类与面向对象编程 第四节——类

    2024-01-28 11:04:01       42 阅读
  10. 代码随想录算法训练营|day17

    2024-01-28 11:04:01       72 阅读
  11. OpenCV 1 - 加载 显示 修改 保存图像

    2024-01-28 11:04:01       48 阅读