目录
1.C语言是什么?
2.搭建开发环境
2.1常用的编译器
2.2选择并安装需要的编译器
3.初始C语言
3.1创建项目
3.2第一个C语言程序
4.数据类型
4.1常见数据类型
4.2数据类型的长度
4.3特殊数据类型
4.4数据在内存中的编码形式
5.变量和常量
5.1变量的定义
5.2变量的命名
5.3变量的分类
5.4常量
6.字符串和转义字符
6.1字符串
6.2转义字符
7.运算符
7.1算术运算符
7.2关系运算符
7.3逻辑运算符
7.4位运算符
7.5赋值运算符
7.6条件运算符
7.7sizeof运算符
8.编程语句
8.1判断语句(选择语句)
编辑8.2循环语句
8.3补充常用语句
9.总结
1.C语言是什么?
C 语言是一种通用的、面向过程的高级程序设计语言。由丹尼斯・里奇在 20 世纪 70 年代初开发,它具有高效、灵活、可移植性强等特点。被广泛用于系统软件(如操作系统)、嵌入式开发、游戏开发等领域 ,是很多编程语言的基础,为开发者提供了对计算机硬件的直接控制能力 。
总之万物始于C,将C学好可以将很多别的编程语言融会贯通。
2.搭建开发环境
2.1常用的编译器
GCC、Clang、Visual Studio Community Edition、Visual Studio Code。
2.2选择并安装需要的编译器
这边以Visual Studio Code为例,它是微软出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、版本管理GIT等特性,支持插件扩展,并针对网页开发和云端应用开发做了优化。软件跨平台支持 Win、Mac 以及 Linux。
VS开始页面
这里面有许多插件可以安装
3.初始C语言
3.1创建项目
注意:C语言程序文件的命名后面要加.c
3.2第一个C语言程序
首先#代表这个语句是预处理语句,预处理动作在include包含的文件里面,三角号<>的含义是“在环境里面找头文件”,stdio.h被称为标准输入输出函数,全称standard input output.header 。
那么为什么会进行这个预处理动作呢?
那是因为当你使用printf函数、scanf函数时,编译器无法识别这些函数的含义,但是C语言环境中创建了这样的头文件,里面包含了它的含义,作用等信息,我们只要对其进行#,做一个预处理动作即可。当然学到后面,我们可以在工程中自定义一些想要的头文件,以便我们能够更简单的实现一些代码。
4.数据类型
4.1常见数据类型
Q: 为什么会出现更高精度的浮点型以及精度更低和更高的整形呢?
A: 这是因为每一个数据类型在C语言程序内存中有各自占用的字节(内存),例如int为4字节,有时为了对应变量减少占用的空间(避免浪费内存),选择short短整形(2字节),另外变量在内存中占用的内存越高,精度越好,能存放的也越多,如long(32位系统4字节,64位系统8字节),long long(8字节),double(8字节)。
在计算机内存的角度看,1字节(Byte)=8位(比特位bit),1KB = 1024 B, 1MB = 1024 KB, 1GB = 1024 MB, 1TB = 1024 GB 。
但是在平时看到的内存一般用1000来换算,而不是1024,比如千兆网(Mb)=125MB/s(网速)。
4.2数据类型的长度
sizeof()是一个运算符,它可以获取变量所占字节数,打印类型有的系统可以%d,但是推荐%zu或者%lu。
4.3特殊数据类型
这些字符类型是比较特殊的,但有时候也用得到。其中使用int这类整型时,没有前缀的情况下,默认为有符号类型signed,只有当像 unsigned int 变量名 = 0 这样使用时,才能说明它是无符号类型。
4.4数据在内存中的编码形式
平时我们的生活中使用的数据主要都是十进制(通俗易懂),但是编译器为了更简单的去实现代码,使用的是二进制的形式,再就是对于内存空间(地址部分)而言,二进制显得又特别长,所以选择使用十六进制的形式表示。
正数:直接使用原码的二进制来表达,比如a=3,在内存中是 0000 0011
负数:用绝对值取反加一来表达(也就是补码),比如a=-3,在内存中是1111 1101
5.变量和常量
生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等) 有些值是可变的(比如:年龄,体重,薪资)。
5.1变量的定义
变量的定义本质就是向系统申请一块合法空间取存放值,空间的内存取决于变量类型的字节大小,有着自己的取值范围并且这块空间是可读可写的。
5.2变量的命名
只能包含数字、字母以及下划线,不能包含其他任何特殊字符。
只能以字母或者下划线开头。
不能跟系统已有的关键字重名,也不能跟本命名空间(namespace)中具有相同作用域的其他标识符重名。
5.3变量的分类
全局变量:{}外定义的变量,全体函数都可以使用
局部变量:{}内定义的变量,只在函数体体内能够使用
5.4常量
C语言中常用的常量方法:
字面常量:平时见到的常量,如100,3.14等等。
const修饰的常变量:constant,当使用 const 关键字修饰一个变量时,该变量的值在初始化后不能被修改。
define自定义的标识符常量:是 C 语言中的预处理指令,用于定义标识符常量。
6.字符串和转义字符
6.1字符串
字符串一种特殊的字符数组,由多个字符组成的,使用""括起来的一串字符,例如"Hello,world"。注意:字符串的末尾有一个结束符'\0',当输出字符串类型时,遇到'\0'会停止输出,当设置一个字符串时,系统会自动在字符串最后生成一个结束符。
接下来展示三个数组,然后打印其结果,看看会发生什么
str1是常用的字符串定义,其输出的是hello。
str2是将多个字符(包括结束符'\0')存放在数组里面(数组以后会讲),其输出的也是hello。
str3比起str2,少了一个结束符,其输出的是hello烫烫烫烫烫(部分编译器系统是输出hellohello,包括我目前使用的Vscode),出现这种情况的原因正是由于没有结束符,编译器找不到结束符,便一直找,输出了一些别的东西,出现乱码的情况。
6.2转义字符
基本的转义字符:
\n - 换行符。将光标移动到下一行的开始位置。
\t - 水平制表符。通常会将光标移动到下一个制表位。
\\ - 反斜杠。用来表示实际的反斜杠字符。
\' - 单引号。用来表示实际的单引号字符。
\" - 双引号。用来表示实际的双引号字符。
\? - 问号。虽然问号本身不需要转义,但在某些情况下为了防止与三字母序列混淆,可能会用到。
\a - 警报声。发出警报声。
\b - 退格。将光标向后移动一个字符的位置。
\f - 换页。跳转到下一页的开始位置。
\r - 回车。将光标移动到当前行的开始位置,但不换行。
\v - 垂直制表符。通常会将光标移动到下方的垂直制表位。
\ooo - 其中ooo是1到3位的八进制数
\xhh - 其中hh...是一个或多个十六进制数字。(\101 和 \x41 都代表大写字母 'A' 的ASCII码值65)
这里面用到了两个转义字符,一个是常用的\n,一个是运用\来得到输出的\n
7.运算符
该表为各运算符之间的优先级以及结合性
7.1算术运算符
运算符
功能说明
举例
+
加法,一目取正
a+b
-
减法,一目取负
a-b
*
乘法
a*b
/
除法
a/b
%
取模(求余)
a%b
++
自加1
a++, ++b
--
自减1
a--, --b
a++是先使用再加一,++a是先加一再使用,--也是一样的道理
注意点:
减号也是负号,比如 -a 是取变量 a 的相反数(a = -a(取正负号,0还是0))
取模运算要求左右两边操作数必须是整型数据。
自加和自减运算不仅可以对整型操作,也可以对浮点数、指针操作。
7.2关系运算符
运算符
功能
举例
说明
>
大于
a > b
判断a是否大于b
>=
大于或等于
a >= 5
判断a是否大于或等于5
< 小于
3 < x
判断3是否小于x
<= 小于或等于
x
判断x是否小于或等于y+1
==
等于
(x+1) == 0
判断x+1是否等于0
!=
不等于
c != ‘\0’
判断c是否不等于’\0’
注意点:
关系运算符用于判断运算符两边的表达式是否满足给定的大小条件。
由关系运算符组成的表达式称为关系表达式,其值为布尔型(即TRUE和FALSE)。
判断是否相等是双等号==,而不是一个等号(是赋值号)。
7.3逻辑运算符
运算符
功能说明
举例
!
逻辑反
!(x==0)
&&
逻辑与
x>0 && x
||
逻辑或
y10
运算规则:
逻辑反:将逻辑真、假翻转,即真变假,假变真。
逻辑与:将两个关系表达式串联起来,当且仅当左右两个表达式都为真时,结果为真。
逻辑或:将两个关系表达式并联起来,当且仅当左右两个表达式都为假时,结果为假。
特殊规则:
在逻辑与运算中,如果左边表达式的值为假,那么右边表达式将不被执行。
在逻辑或运算中,如果左边表达式的值为真,那么右边表达式将不被执行。
7.4位运算符
运算符
名称
举例
功能说明
~
位逻辑反
~a
将变量 a 中的每一位取反
&
位逻辑与
a & b
将变量 a 和 b 逐位进行与操作(任何数与上0都为0)
|
位逻辑或
a | b
将变量 a 和 b 逐位进行或操作(任何数或上1都为其1)
^
位逻辑异或
a ^ b
将变量 a 和 b 逐位进行异或操作(相同为0,不同为1)
<< 左移
a << 4
将变量 a 中的每一位向左移动4位
>>
右移
a >> 4
将变量 a 中的每一位向右移动4位
位运算符操作的对象是数据中的每一位
运算规则:
位逻辑反、位逻辑与、位逻辑或拥有与逻辑运算相似的规则和一样的真值表
异或运算:相同为0,不同为1
移位运算:移出去的不要,空出来的补零。移位运算都是针对无符号数的运算。
7.5赋值运算符
==、+=、-=、*=、/=、%=、|=、&=、^=、>>=、<<=
以上都属于赋值运算符,a+=1等价于a=a+1,其他一致
7.6条件运算符
表达式1?表达式2(真):表达式3(假)
表达式1为真时,表达式2成立,否则表达式3成立
7.7sizeof运算符
含义:计算指定数据类型或者变量所占据内存的字节数
语法:sizeof(数据类型) 、sizeof(变量) ,计算变量、常量的字节数时圆括号可以省略(但是类型不可省略
Q:sizeof和strlen的区别是什么?
A:sizeof用于计算数据类型或变量所占据内存的字节大小,遇到"\0"会计算其字符的字节大小; 而strlen是计算字符串的长度,遇到"\0"时终止。
注意:sizeof()其输出所需的格式控制符位%lu
8.编程语句
C语句的基本结构是:顺序结构、选择结构、循环结构
接下来将主要讲一下选择和循环结构,由于该文章是为了初步认识c语言,所以一些较为复杂的内容在之后再细讲。
8.1判断语句(选择语句)
if()、else if()括号内都是关于条件的判断,成立为真,否则为假
注意:
1. if 语句可以单独使用,else 语句不可以,else 语句必须跟if语句配套使用。2. 不管是 if 语句还是 else 语句,代码块都必须使用大括号{}括起来,否则只有首句有效。3. 注意if语句后面是否有;号,如果其加了;号,不论语句判断是否正确,都将会执行{}里的内容。
if语句:表达一种 如果-则 的条件执行关系
如果a>b成立,则为真,执行{}内的语句,否则不执行。
if - else语句:表达一种 如果-否则 的互斥分支关系
如果a>b成立,则为真,执行if{}内的语句,否则执行else{}内的语句。
if- else if - else if - ...... else:表达一种多路分支的关系,都互相排斥
如果a>b成立,则为真,执行if{}内的语句,否则继续判断下一个条件a==b,成立则为真,执行其else if{}内的语句,否则执行else{}内的语句,多个else if同理。
switch语句:表达一种多路分支的关系,都互相排斥
要点解析:1. switch(n) 语句中的 n 必须是一个整型表达式,即 switch 判断的数据必须是整型(字符(本质上就是单字节整型)、整型数据(变量(num1、num2...)、常量(1,2,3...)、整型表达式)2. case 语句只能带整型常量,包括普通整型或字符,不包括 const 型数据。3. break 语句的作用是跳出整个 swtich 结构,没有 break 程序会略过case往下执行4. default 语句不是必须的,一般放在最后面(因此不需要 break)
讲个重点:关于有无break的说明
无break语句:由于没有break会在满足条件的case处往后面一直执行到最后
有break语句:执行完满足条件的语句后遇到break跳出switch语句
8.2循环语句
接下来的内容,从循环语句(重点内容)开始之后,难度就慢慢地起来了,在这方面务必要做到认真学习,一定要做到多加练习,动手能力对于编程水平的提高非常重要。
循环语句在 C 语言里是基础语法的核心,它能让代码按设定条件重复执行,大大提升编程效率,减少重复代码。
打个比方,这就像工厂流水线包装产品,没循环的话,每个产品都要单独编包装代码,效率极低。而循环就像自动化流水线,设定好起始、结束条件和每次操作内容,就能高效完成任务。
编程里,处理数组时经常要遍历元素,像计算学生成绩平均分,用循环遍历数组累加成绩再求平均就行。查找算法里,检查数据找目标元素也得靠循环。没有循环,这些功能很难实现。
总之,循环语句是程序自动化、智能化的基础,让计算机自动处理重复性任务,不管简单计算还是复杂开发,都发挥着不可替代的作用,是构建高效程序的关键。
while循环语句
do - while循环语句(很少用)
很少用得到,会用就行
for循环语句(最常用)
循环语句中的重点来了,for循环是平时编程中用的最多的,也是最好用的,因为它的初始化,条件判断,计算器可以放在一行中,可以降低阅读难度,更加简洁明了。
其循环头的标准写法是for(表达式1 ;表达式2 ;表达式3)表达式1是一般为初始化计数器。表达式2是一般为循环条件的判断,为真则进入循环,为假则退出循环。表达式3是一般为计算器的增减,更新循环变量。三个表达式均可以省略,但;不可以省略,for(;;)相当于while(1),都是死循环。
for的标准形式
for等价的形式
while等价的形式
for省略三个表达式的样子
8.3补充常用语句
continue语句:结束当前循环,进入下一个循环
break语句:(1)跳出switch语句;(2)跳出当前的循环体
示例代码:
continue对于break来说一般不会跳跃太大,两个一起理解起来还是很简单的。
9.总结
我很早就开始学习C语言了,但是一直学的零零散散,这次是下定决心去学了,也是为了给嵌入式开发做准备。这门编程语言不简单,要是真学会了理解了,别的编程语言学起来也不会难。而关于这方面的工作,门槛不高,下线可以很低,上线也可以很高,希望不论是我自己,也是看了这篇文章的朋友,都能够坚持去学完C语言,船到桥头自然直。
这篇文章属于是我在学习时的笔记和心得,难度不高,适合初学者了解C语言,但这些基础都是需要掌握的,写这篇文章也是为了巩固一下自己学的知识,当然我不止学到这些,比较深入的内容打算之后再写,再好好理解一下。这篇文章可能有些不足,如果有,也希望能够给我指出来,但如果对你有帮助也希望你能够留下你宝贵的点赞支持一下我,在这之后我也会将最重要的数组,指针,内存这方面的知识分开写一遍,有想继续学习的朋友,可以继续留意一下我。
而且我认为学习C语言,嵌入式开发的过程中,一个良好的习惯很重要,无论是做笔记,还是平时写的规范化,都得做好,也希望这方面能够帮助到各位。