编程之旅:初识C语言

一、C语言概念

目录


正文开始

1.C语言是什么?


(1)中级语言:直接操作硬件,兼具高级语言易读性与底层控制能力。
(2)结构化编程:函数和代码块组织程序。
(3)面向过程:以步骤和逻辑为核心,适合系统开发。

2.C语言的历史和辉煌


(1)1972年由丹尼斯·里奇为开发Unix系统设计。
(2)影响深远:C++、Java、Python等均受其启发。
(3)核心地位:操作系统(Linux/Windows)、嵌入式(单片机)、驱动开发的基础。

Windows(个人)、MaxOS(苹果)、Linux(服务器)、Unix(实验室)

3.编译器的选择-VS2022

3.1编译和链接

C语言是一门编译型计算机语言,C语言源代码都是文本文件,文本文件本身无法执行,必须通过编译
器翻译和链接器的链接
,生成二进制的可执行文件,可执行文件才能执行。
C语言代码是放在·c为后缀的文件中的,要得到最终运行的可执行程序,中间要经过编译和链接2个
过程。
优势:集成开发环境(代码编辑+编译+调试),适合Windows平台。
其他工具:GCC(Linux)、Clang(跨平台),但VS2022对新手友好
一个工程一般都会有多个源文件组成,如下图,演示源程序经过编译器和链接器的过程图
在这里插入图片描述
注:
1.每个源文件(.c)单独经过编译器处理生成对应的目标文件(obj为后缀的文件)
2.多个目标文件和库文件经过链接器处理生成对应的可执行程序(.exe文件)
这就是,在Windows电脑上C语言程序生成的exe可执行文件

3.2编译器的对比

C语言是一门编译型的计算机语言,需要依赖编译器将计算机语言转换成机器能够执行的机器指令。
那我们常见的C语言编译器都有哪些呢?
比如:msvc、clang、gcc就是一些常见的编译器,当然也有一些集成开发环境如:VS2022、
XCode、CodeBlocks、DevC++、Clion等。

  • VS2022集成了MSVC(安装包较大一些,安装简单,无需多余配置,使用起来非常方便)
  • XCode集成了clang(苹果电脑上的开发工具)
  • CodeBlocks集成了gcc(这个工具比较小众,需要配置环境,不太推荐)
  • DevC++集成了gcc(小巧,但是工具过于简单,对于代码风格的养成不好,一些竞赛使用)
  • Clion是默认使用CMake,编译器是可以配置的(工具是收费,所以暂时推荐大家使用)

3.3VS2022

优点:

  • VS2022是一个主流的集成开发环境,企业中使用较为普遍
  • VS2022包含了:编辑器+编译器+调试器,功能强大
  • 直接安装即可使用,基本不用额外配置环境,上手容易
  • 默认界面是中文的,初学者友好
    缺点:
  • 功能丰富,安装包大,占用空间多。

4.VS项目和源文件、头文件介绍


在VS上写代码,我们是需要创建项目的,直接新建项目就可以了。
在项目中就可以添加源文件和头文件。
C语言把.c为后缀的文件称为源文件,把.h为后缀的文件称为头文件。
在这里插入图片描述

5.第一个C语言程序

1 #include<stdio.h>
2 
3 int main()
4{		printf("Holle! N\n");
5 		return 0;
6}

VS2022快捷运行键Ctrl+F5

6.main函数


每个C语言程序不管有多少行代码,都是从main函数开始执行的,main函数是程序的入口,
main函数也被叫做:主函数。main前面的int表示main函数执行结束的时候返回一个整型类
型的值。所以在main函数的最后写return 0;正好前后呼应。

  • main函数是程序的入口
  • main函数有且仅有一个
  • 即使一个项目中有多个.c文件,但是只能有一个main函数(因为程序的入口只能有一个)

7.printf和库函数

在上面的代码中有一句代码如下:

1 printf("hello C\n");

代码中使用了printf函数,实现了在屏幕上的信息的打印。
这里简单的介绍一下printfprintf是一个库函数,它的功能是在标准输出设备(一般指屏
幕)上进行信息的打印。上面的代码是使用printf函数打印字符串。只要把想要打印的一串字符放
在双引号中并传递给printf函数就可以打印。
printf函数也可以用来打印其他类型的数据,比如:

2 printf("%d\n",n);//printf打印整型
3 printf("‰c\n", 'q'); //printf打印字符
4 printf("‰lf\n"3.14); //printf打印双精度浮点型

这里的%d,%c等是占位符,会被后边的值替换。(后期课程再介绍)
同时我们在使用库函数的时候,是需要包含头文件的,比如:printf函数需要包含的就是
stdio.h这个头文件,具体的方法就是:

#include<stdio.h>

库函数是编程语言中预先封装好的功能模块,其本质是为开发者提供可复用的代码解决方案。在C语言中,标准库函数由ISO/IEC标准严格定义,各编译器厂商依据该规范进行实现。它们主要发挥以下核心作用:

  • 消除重复开发 - 将字符串处理、数学运算、输入输出等高频操作标准化封装,避免开发者重复实现基础功能
  • 保证跨平台一致性 - 通过统一的标准规范,确保同一函数在不同编译环境和操作系统中的行为一致性
  • 提升开发效能 - 直接调用经过深度优化的可靠实现,相比自主开发更能保障执行效率和代码质量

8.关键字介绍


C语言中有一批保留的名字的符号,比如:intifreturn,这些符号被称为保留字或者关键
字。

  • 关键字都有特殊的意义,是保留给C语言使用的
  • 程序员自己在创建标识符的时候是不能和关键字重复的
  • 关键字也是不能自己创建的。

C语言的32个关键字如下:

1 break double else char auto continue default do const case enum extern
2 float for if long short signed sizeof return goto int register static
3 struct switch typedef union unsigned void volatile while

注:在C99标准中加入了inlinerestrictBoolComplex_Imaginary等关键
字。

9.字符和ASCII编码


在键盘上可以敲出各种字符,如:a,q,@,#等,这些符号都被称为字符,C语⾔中字符是⽤单引号
括起来的,如:‘a’,‘b’,‘@’。
我们知道在计算机中所有的数据都是以⼆进制的形式存储的,那这些字符在内存中分别以什么样的⼆
进制存储的呢?如果我们每个⼈⾃⼰给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为
了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准ASCII编码,C
语⾔中的字符就遵循了ASCII编码的⽅式。

ASCII码表

在这里插入图片描述
参考:https://zh.cppreference.com/w/cpp/language/ascii
我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数
据:
• 字符A~ Z的ASCII码值从65~90
• 字符a~ z的ASCII码值从97~122
• 对应的大小写字符(a和A)的ASCII码值的差值是32
• 数字字符0~ 9的ASCII码值从48~57
• 换⾏\n的ASCII值是:10
• 在这些字符中ASCII码值从0~31这32个字符是不可打印字符,⽆法打印在屏幕上观察

实践检验更深刻

单个字符的打印可以使⽤%c来指定格式:

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5 printf("%c\n", 'Q');
 6 printf("%c\n", 81);//这⾥的81是字符Q的ASCII码值,也是可以正常打印的
 7 return 0;
 8 }

可打印字符展示:

1 #include<stdio,h>
2 
3 int main()
4  {
5      	int i = 0;
6       for(i = 32; i <= 127; i++)
7 		{
8 		printf("%c",i);
9			if (i % 16 == 15)
10				printf("\n");
11		}
12		return 0;
13 }

在这里插入图片描述

10.字符串和\0


C语⾔中如何表⽰字符串呢?使⽤双引号括起来的⼀串字符就被称为字符串,如:“abcdef”,就是一个字符串。
字符串的打印格式可以使⽤%s来指定,也可以直接打印如下:

1 #include<stdio,h>
2 
3 int main()
4  {
5       printf("%s\n", "hello C");
6 		printf("hello c");
7 		return 0;
8 }

C语⾔字符串中⼀个特殊的知识,就是在字符串的末尾隐藏放着⼀个\0字符,这个\0字符是字符串的结束标志。(可在VS2022的监视窗口看见)

对于字符串"abcdef",我们实际上看到了6个字符:a,b,c,d,e,f,但是实际上在末尾还隐藏⼀个
转义字符,\0字符串的结束标志。所以我们在使⽤库函数strlen() 计算字符串⻓度的时候,遇到printf() 打印字符串或者\0 的时候就⾃动停⽌了。

C语言可以把一个字符串放在一个字符数字中,用下面代码验证一下\0的功能。

1 #include<stdio,h>
2 
3 int main()
4  {
5       char arr1[] = {'a', 'b', 'c'};//arr1数组中存放3个字符
6 		char arr2[] = "abc"; //arr2数组中存放字符串
7		printf("%s\n", arr1);
8		printf("%s\n", arr2);
9
10 		return 0;
11 }

这样的代码,我调试的时候,观察⼀下arr1 arr2 的内容:
在这里插入图片描述
运行结果:
在这里插入图片描述
我们可以看到,arr1 字符数组在打印的时候,打印了abc后还打印了⼀些随机值,这就是因为arr1在末尾的地⽅没有\0字符作为结束标志,在打印的时候没有停⽌。
但是arr2的打印就是完全正常的,就是因为arr2 数组是使⽤字符串常量初始化的,数组中有作为技术标志,打印可以正常停⽌。

如果我们在arr1数组中单独放⼀个’\0’字符会怎么样呢?

1 #include<stdio,h>
2 
3 int main()
4  {
5       char arr1[] = {'a', 'b', 'c','\0'};/
6 		char arr2[] = "abc"; 
7		printf("%s\n", arr1);
8		printf("%s\n", arr2);
9		printf("%s\n", "abc\0def");
10 		return 0;
11 }

在这里插入图片描述
看到三次打印的结果是⼀样的了,都是打印到\0的时候就停⽌了,那从上述的例⼦我们确实能够观察到\0的作⽤和重要性的。

11.转义字符


我们可以看到修改的前后代码输出的结果,截然不同的,那这是为什么呢?
这就是转义字符的问题,\n是一个转义字符表示换行的意思,我们可以简单的理解为\n的意思发生了转变,n本来是一个普通的字符,被\转义为换行的意思。
C语言中像这样的转义字符还有一些,具体如下:
\?:在书写连续多个问号时使用,防止他们被解析成三字母词,在新的编译器上没法验证了。
\':用于表示字符常量
\":用于表示一个字符串内部的双引号
\:用于表示一个反斜杠,防止它被解释为一个转义序列符。
\a:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。
\b:退格键,光标回退一个字符,但不删除字符。
\f:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v。
\n:换行符。
\r:回车符,光标移到同一行的开头。
\t:制表符,光标移到下一个水平制表位,通常是下一个4/8的倍数。
\v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
下面2种转义字符可以理解为:字符的8进制或者16进制表示形式
\ddd:ddd表示1~3个八进制的数字。如:\130表示字符X
\xdd:d d表示2个十六进制数字。如:x30 表示字符0
\0:null字符,代表没有内容,\0就是\ddd这类转义字符的一种,用于字符串的结束标志,其ASCII码值是0.
转义字符参考:https://zh.cppreference.com/w/c/language/escape

12.语句和语句分类


C语言的语句分为五类:

  • 空语句
  • 表达式语句
  • 函数调用语句
  • 复合语句
  • 控制语句

12.1 空语句
空语句是最简单的,⼀个分号就是⼀条语句,是空语句。

1 #include<stdio,h>
2  int main()
3  {
4//空语句	
5 		return 0;
6 }

空语句,⼀般出现的地⽅是:这⾥需要⼀条语句,但是这个语句不需要做任何事,就可以写⼀个空语句。

12.2 表达式语句
表达式语句就是在表达式的后边加上分号。如下所⽰:

1 #include<stdio,h>
2  int main()
3  {
4 		int a =20;
6		int b =13;
7  		b = a + 5;//表达式语句	
8 		return 0;
9 }

12.3 函数调用语句
函数调⽤的时候,也会加上分号,就是函数调⽤语句。

1 #include<stdio,h>
2  int Add(int x, int y)
3  {
4 		return x+y;
5  }	
6  int main()
7  {
8		printf("hehe\n");
9		int ret = Add(2,3);//函数调用语句
10 		return 0;//函数调用语句
11 }

12.4 复合语句
复合语句其实就是代码块,成对括号中的代码就构成⼀个代码块,也被称为复合语句。

1 #include<stdio,h>
2  void print(int arr[],int sz)//函数的大括号中的代码也构成复合语句
3  {
4 		int i = 05  		for(i = 0; i<sz; i++)
6  		{
7  			printf("%d",arr[i]);
8		}
9  }
10 int main()
11 {
12 		int i = 0;
13		int arr[10] = [0];
14		for(i = 0; i<10; i++)//for循环的循环体的大括号中的就是复合语句
15		{
16			arr[i] = 10-i;
17			printf("%d\n",arr[i]);
18		}
19		return 0;
20 }

12.5 控制语句
控制语句⽤于控制程序的执⾏流程,以实现程序的各种结构⽅式(C语⾔⽀持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语⾔有九种控制语句
可分成以下三类:

    1. 条件判断语句也叫分⽀语句:if语句、switch语句;
    1. 循环执行语句:dowhile语句、while语句、for语句;
    1. 转向语句:break语句、goto语句、continue语句、return语句。

13.注释是什么?为什么写注释?

注释是帮助程序员自己理解代码,或者让其他程序员能看懂的语句。
注释有两种形式:
13.1 /**/的形式
第⼀种⽅法是将注释放在/*...*/之间,内部可以分行。

1 /* 注释*/
2 
3 /*
4	这是⼀⾏注释
5 */ 

这种注释可以插在行内。

1 int fopen(char* s/*file name */, int mode);

上⾯⽰例中,/* file name */ ⽤来对函数参数进⾏说明,跟在它后⾯的代码依然会有效执⾏。这种注释⼀定不能忘记写结束符号*/,否则很容易导致错误。

1 printf("a "); /* 注释⼀
2 printf("b ");
3 printf("c "); /* 注释⼆*/ 
4 printf("d ");

上⾯⽰例的原意是,第⼀⾏和第三⾏代码的尾部,有两个注释。
但是,第⼀⾏注释忘记写结束符号,导致注释⼀延续到第三⾏结束。/**/ 的这个注释也不⽀持嵌套注释,/* 开始注释后,遇到第⼀个*/就认为注释结束了。

1 /*
2 printf("a ");
3 printf("b ");
4 printf("c "); /* 注释⼆*/ 
5 printf("d ");
6 /*

13.2 //的形式
第⼆种写法是将注释放在双斜杠// 后⾯,从双斜杠到⾏尾都属于注释。这种注释只能是单⾏,可以放在⾏⾸,也可以放在⼀⾏语句的结尾。这是C99标准新增的语法。

1 //这是一行注释
2 
3 int x = 1;//这也是注释

13.3 注释会被替换
编译时,注释会被替换成⼀个空格,所以min/*这里是注释*/Value会变成min Value,而不是minValue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值