一、初识C语言
文章目录
前言:
人和人之间的交流使用的是自然语言,如:汉语、英语、日语等等。
那么人和计算机又是如何交流的呢?
人们通过计算机语言写的程序,给计算机下达指令,让计算机工作。
C语言就是人们和计算机交流的程序设计语言
程序设计语言是用于书写计算机程序的语言,语言的基础为一组记号和一组规则。
根据规则由记号构成的记号串的总体就是语言。这些记号串就是程序。
语法:表示程序的结构或形式,即表示构成语言的各个记号之间的组合规律,但不涉及记号的特殊含义。
语义:表示程序的含义。
语用:表示各个符号和语句在程序段中的用法或作用。
目前已知的计算机语言已有上千种,C语言是众多计算机语言中的一种,常见的计算机语言还有C++/Java/Go/Python。
1.C语言的概述
C语言是一门面向过程的结构化的高级计算机语言。
面向过程的思想:强调函数的独立性和数据的显式流动,通过将复杂问题分解为简单函数(过程),实现程序的模块化和复用。
结构化:通过函数抽象和控制结构规范化,将复杂问题分解为简单模块,使程序具有良好的可读性和可维护性。
一句话总结:C语言就是由许多的子函数构成。
2.C语言的起源
C语言最初是作为Unix系统的开发工具而发明的。
1969年:B语言的诞生
1969年,贝尔实验室的肯·汤普森(Ken Thompson)与丹尼斯·里奇(Dennis Ritchie)一起开发了Unix操作系统。Unix系统是使用汇编语言编写的,汤普森为了方便移植到其他计算机就在BCPL语言的基础上发明了B语言。
1972年:C语言的诞生
1972年,丹尼斯·里奇和布莱恩·柯林汉又在B语言的基础上重新设计了一种新的语言,这种新的语言取代了B语言,所以称为C语言。
1973年:Unix系统的重写
1973年,整个Unix系统使用C语言重写。此后C语言广泛用于各种操作系统和系统软件的开发。
1988年:C语言的标准化
1988年,美国国家标准协会(ANSI)正式将C语言标准化,标志着C语言开始稳定和规范化。
至今:
在计算机语言的使用排行榜上一直霸占前三名。
[计算机语言使用排行榜](TIOBE Index - TIOBE)
3.编写C语言的编译器
3.1编译和链接
C语言是一门编译型计算机语言,C语言源代码都是文本文件,文件本身无法执行,必须通过编译器翻译和连接器的链接,生成二进制的可执行文件,才能被执行。
C语言的代码是放在.c为后缀的文件(源文件)中的,要得到最终可运行的可执行文件,中间要经过编译和链接两个过程。
每个源文件(.c)单独经过编译器处理生成对应的目标文件(.obj为后缀的文件)
多个目标文件和库文件经过链接器处理生成对应的可执行文件(.exe文件)
3.2常见C语言的编译器
常见的C语言编译器:msvc、clang、gcc等。
常见的集成开发环境:vs2022、XCode、CodeBlocks、DevC++、Clion等。
集成开发环境(IDE):用于提供程序开发环境的应用程序,一般包括编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、调试功能等一体化开发软件服务套。
- VS2022集成了MSVC(安装包较大,安装使用简单,推荐使用)
- XCode集成了clang(苹果电脑的开发工具)
- CodeBlocks集成了gcc(需要配置环境)
- DevC++集成了gcc(竞赛常用的C/C++编译器)
- Clion默认使用CMake,编译器可以配置(收费软件)
3.3使用VS2022创建项目
使用VS2022的优点:不用配置环境,上手简单,功能强大,并且是中文的,对于初学者比较友好。
直接新建项目,选择空项目,在空项目中新建源文件,在C语言中使用.c后缀结尾的文件为源文件,以.h后缀结尾的文件为头文件。
如图所示:
4.第一个C语言程序
#include <stdio.h>
int main(){
printf("Hello World!");
return 0;
}
上述程序有以下几个部分组成:
- #include <stdio.h>:库函数printf()的头文件,想要调用库函数就必须包含相对应的头文件。
- int main(){ }:main函数,其中int为主函数的返回值类型,main函数是整个程序的入口,一个C语言项目(即使有多个.c文件)中只能有一个main函数。
- printf():这是一个库函数,作用是在控制台输出:Hello World!,想要调用这个库函数必须包含#include <stdio.h>头文件。
- return 0:函数结束时,返回一个0
执行上述程序的效果是在控制台输出:Hello World!
如下图所示:
库函数的定义:为了不用重复实现某些常用的代码,C语言标准规定了一些函数,这些函数组成了函数库,即库函数。
一系列的库函数声明通常包含在同一个头文件中,所以想要调用库函数必须包含相对应的头文件。库函数可以提高程序员的开发效率。
main函数的定义方式有多种:
int main(){}:目前常用的定义方式,返回一个int类型,没有参数列表,但实际中我们传参对代码也没有任何影响
#include <stdio.h>
int main()
{
main(1, 2, 3);
return 0;
}
int main(void){}:返回一个int类型,强调没有参数,即我们在调用main函数时不能传参了
#include <stdio.h>
int main(void)
{
main(1, 2, 3);//这里编译器会报错
return 0;
}
int main(int argc,char * argv[]):比较古老的写法,目前已经很少见了,返回一个int类型,两个参数int argc和char* arg[]
#include <stdio.h>
int main(int argc,char* argv[])
{
return 0;
}
5.关键字与标识符
关键字:C语言中保留的具有特殊意义的符号。
C语言中一共有32个关键字:
//基本数据类型
int char float double void
//类型修饰关键字
short long signed unsigned
//复杂类型关键字
struct union enum typedef sizeof
//循环语句
for while do break continue
//条件语句
if else goto
//开关语句
switch case default
//存储类型关键字
auto extern register static
//其他关键字
const volatile sizeof
标识符:程序员自己定义的由大小写字母、数字和下划线(_)组成的字符串符号,如变量名、函数名、类名等等。
标识符的命名规则:
- 不能由数字开头
- 不能是关键字
- 严格区分大小写
关键字不能够自己创建,并且标识符不能和关键字重名。
6.ASCII编码
我们看到的字符在计算机中的存储形式是二进制,将字符编一个二进制序列的过程就是编码,美国标准协会(ANSI)为了防止每个人的编码不同,就出台了ASCII编码。
下表包含所有 128 个 ASCII 十进制 **(dec)、**八进制 **(oct)、**十六进制 (hex) 和字符 (ch) 代码。
dec | oct | hex | ch | dec | oct | hex | ch | dec | oct | hex | ch | dec | oct | hex | ch |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | NUL(空) | 32 | 40 | 20 | (空格) | 64 | 100 | 40 | @ | 96 | 140 | 60 | ` |
1 | 1 | 1 | SOH(标头的开头) | 33 | 41 | 21 | ! | 65 | 101 | 41 | A | 97 | 141 | 61 | a |
2 | 2 | 2 | STX(文本开头) | 34 | 42 | 22 | " | 66 | 102 | 42 | B | 98 | 142 | 62 | b |
3 | 3 | 3 | ETX(文末) | 35 | 43 | 23 | # | 67 | 103 | 43 | C | 99 | 143 | 63 | c |
4 | 4 | 4 | EOT(传输结束) | 36 | 44 | 24 | $ | 68 | 104 | 44 | D | 100 | 144 | 64 | d |
5 | 5 | 5 | ENQ(查询) | 37 | 45 | 25 | % | 69 | 105 | 45 | E | 101 | 145 | 65 | e |
6 | 6 | 6 | ACK(确认) | 38 | 46 | 26 | & | 70 | 106 | 46 | F | 102 | 146 | 66 | f |
7 | 7 | 7 | BEL(铃铛) | 39 | 47 | 27 | ’ | 71 | 107 | 47 | G | 103 | 147 | 67 | g |
8 | 10 | 8 | BS(退格键) | 40 | 50 | 28 | ( | 72 | 110 | 48 | H | 104 | 150 | 68 | h |
9 | 11 | 9 | HT(水平选项卡) | 41 | 51 | 29 | ) | 73 | 111 | 49 | I | 105 | 151 | 69 | i |
10 | 12 | 0a | LF(换行 - 新行) | 42 | 52 | 2a | * | 74 | 112 | 4a | J | 106 | 152 | 6a | j |
11 | 13 | 0b | VT(垂直选项卡) | 43 | 53 | 2b | + | 75 | 113 | 4b | K | 107 | 153 | 6b | k |
12 | 14 | 0c | FF(表单馈送 - 新页面) | 44 | 54 | 2c | , | 76 | 114 | 4c | L | 108 | 154 | 6c | l |
13 | 15 | 0d | CR(回车) | 45 | 55 | 2d | - | 77 | 115 | 4d | M | 109 | 155 | 6d | m |
14 | 16 | 0e | SO(移出) | 46 | 56 | 2e | . | 78 | 116 | 4e | N | 110 | 156 | 6e | n |
15 | 17 | 0f | SI(Shift 键) | 47 | 57 | 2f | / | 79 | 117 | 4f | O | 111 | 157 | 6f | o |
16 | 20 | 10 | DLE(数据链路转义) | 48 | 60 | 30 | 0 | 80 | 120 | 50 | P | 112 | 160 | 70 | p |
17 | 21 | 11 | DC1(设备控制 1) | 49 | 61 | 31 | 1 | 81 | 121 | 51 | Q | 113 | 161 | 71 | q |
18 | 22 | 12 | DC2(设备控制 2) | 50 | 62 | 32 | 2 | 82 | 122 | 52 | R | 114 | 162 | 72 | r |
19 | 23 | 13 | DC3(设备控制 3) | 51 | 63 | 33 | 3 | 83 | 123 | 53 | S | 115 | 163 | 73 | s |
20 | 24 | 14 | DC4(设备控制 4) | 52 | 64 | 34 | 4 | 84 | 124 | 54 | T | 116 | 164 | 74 | t |
21 | 25 | 15 | NAK(否定承认) | 53 | 65 | 35 | 5 | 85 | 125 | 55 | U | 117 | 165 | 75 | u |
22 | 26 | 16 | SYN(同步空闲) | 54 | 66 | 36 | 6 | 86 | 126 | 56 | V | 118 | 166 | 76 | v |
23 | 27 | 17 | ETB(传输块末端) | 55 | 67 | 37 | 7 | 87 | 127 | 57 | W | 119 | 167 | 77 | w |
24 | 30 | 18 | CAN(取消) | 56 | 70 | 38 | 8 | 88 | 130 | 58 | X | 120 | 170 | 78 | x |
25 | 31 | 19 | EM(媒介结束) | 57 | 71 | 39 | 9 | 89 | 131 | 59 | Y | 121 | 171 | 79 | y |
26 | 32 | 1a | SUB(替补) | 58 | 72 | 3a | : | 90 | 132 | 5a | Z | 122 | 172 | 7a | z |
27 | 33 | 1b | ESC(逃脱) | 59 | 73 | 3b | ; | 91 | 133 | 5b | [ | 123 | 173 | 7b | { |
28 | 34 | 1c | FS(文件分隔符) | 60 | 74 | 3c | < | 92 | 134 | 5c | \ | 124 | 174 | 7c | | |
29 | 35 | 1d | GS(组分隔符) | 61 | 75 | 3d | = | 93 | 135 | 5d | ] | 125 | 175 | 7d | } |
30 | 36 | 1e | RS(记录分隔符) | 62 | 76 | 3e | > | 94 | 136 | 5e | ^ | 126 | 176 | 7e | ~ |
31 | 37 | 1f | US(单位分隔符) | 63 | 77 | 3f | ? | 95 | 137 | 5f | _ | 127 | 177 | 7f | DEL(删除) |
建议记住的几组特殊数据:
- 字符A-Z的ASCII码值为65~90
- 字符a-z的ASCII码值为97~122
- 字符0-9的ASCII码值为48~57
- 换行\n的ASCII码值为10
- ASCII码值从0~31这32个字符为不可打印字符,无法在屏幕上打印
7.转义字符
在字符中有一组特殊的字符:转义字符,它们可以改变字符原来的意义。
例如:n为普通字符,在屏幕上打印就是一个n,但如果在n的前面加上/,形成一个转义字符/n,/n在屏幕上打印就是一个换行了。
以下为C语言中常见的转义字符:
• ? :在书写连续多个问号时使⽤,防⽌他们被解析成三字⺟词,在新的编译器上没法验证了。
•\ ’ :⽤于表⽰字符常量’
•\ " :⽤于表⽰⼀个字符串内部的双引号
•\ \ :⽤于表⽰⼀个反斜杠,防⽌它被解释为⼀个转义序列符。
• \a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发⽣。
• \b :退格键,光标回退⼀个字符,但不删除字符。
• \f :换⻚符,光标移到下⼀⻚。在现代系统上,这已经反映不出来了,⾏为改成类似于
• \n :换⾏符。
• \r :回⻋符,光标移到同⼀⾏的开头。
• \t :制表符,光标移到下⼀个⽔平制表位,通常是下⼀个8的倍数。
• \v :垂直分隔符,光标移到下⼀个垂直制表位,通常是下⼀⾏的同⼀列。
•\ddd:ddd表示1~3个8进制数。 如\130,表示字符X
•\xdd:dd表示2个十六进制数。 如\x30,表示字符0
8.语句和语句分类
C语言中的代码是由一条一条的语句构成的,语句具体分为五类:空语句、表达式语句、函数调用语句、复合语句、控制语句。
8.1 空语句
一个逗号就可以构成一条语句,这个语句就是空语句
#include <stdio.h>
int main(){
;//空语句
return 0;
}
8.2表达式语句
#include <stdio.h>
int main(){
int a=10;
int b=20;
int d=100;
int c=a+b;//表达式语句
a=(b,c,d);//逗号表达式,返回从左到右最后一个值,即a=d
return 0;
}
8.3函数调用语句
#include <stdio.h>
int main(){
printf("Hello World!");//函数调用语句
return 0;
}
8.4复合语句
#include <stdio.h>
int main(){
{
int a=10;
int b=20;
printf("%d\n",a+b);
}//在花括号内的语句就是复合语句
return 0;
}
8.5控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构方式,顺序结构,选择结构,循环结构)。
它们由特定的语句定义字符组成,C语言共有九种控制语句可以分成以下三类:
- 条件判断语句(分支语句):if、switch;
- 循环语句:for、while、do while;
- 转向语句:return、goto、countinue、break;
9.注释
注释是我们对代码的说明,在运行时编译器会将注释替换成一个空格,从而将注释忽略而对实际代码不会造成影响。
注释是写给我们自己或其他程序员看的,方便我们理解代码,但也不要过度的注释,不要写没有必要的注释。
9.1/**/形式的注释
#include <stdio.h>
int main(){
/*这是一个注释*/
/*
这是一个注释,内部可以换行
*/
printf("%d\n",1/*这是一个注释,可以插在行内*/);
/*第1行注释
/*第2行注释
注释不能嵌套,第1行注释开始遇到第3行注释结束,所以第四行注释编译器会报错
*/第3行注释
*/第4行注释
return 0;
}
9.2//形式的注释
#include <stdio.h>
int main(){
//这是一个注释
printf("%d\n",1);//这是一个注释,只能单行
return 0;
}
结语:
通过上面的学习,希望能够帮助你更好的了解C语言的一些基本知识,总的来说C语言需要学习的主要有两大内容,一个是数据,另一个是就是流程控制语句。