前言

笔者在此记录在学习C语言的过程中遇到的知识点以及踩过的坑,既是给自己的笔记也分享给大家,欢迎大家交流讨论。

本章主要是一些C语言中常见的概念,有部分涉及但没深入的在后面的文章中都会讲到

1.C语言是什么

⼈和⼈交流使⽤的是⾃然语⾔,如:汉语、英语、⽇语...

那⼈和计算机是怎么交流的呢?——计算机语⾔.

⽬前已知已经有上千种计算机语⾔,⼈们是通过计算机语⾔写的程序,给计算机下达指令,让计算机⼯作的.

C语⾔就是众多计算机语⾔中的⼀种,当然C++/Java/Go/Python都是计算机语⾔.

2.C语言的起源

1972年,贝尔实验室的丹尼斯.里(Dennis Ritch)和肯.汤普逊(Ken Thompson)在开发UNIX操作系统时设计了C语言,然鹅C语言又是在B语言(汤普逊发明)的基础上进行设计的.至于B语言,那又是另一个故事了.

3.编译和链接

C语⾔是⼀⻔编译型计算机语⾔,C语⾔源代码都是⽂本⽂件,⽂本⽂件本⾝⽆法执⾏,必须通过编译器翻译和链接器的链接,⽣成⼆进制的可执⾏⽂件,可执⾏⽂件才能执⾏.

C语⾔代码是放在 .c 为后缀的⽂件中的,要得到最终运⾏的可执⾏程序,中间要经过编译链接2个过程.

具体过程如图.

注:

1. 每个源⽂件(.c)单独经过编译器处理⽣成对应的⽬标⽂件(.obj为后缀的⽂件)

2. 多个⽬标⽂件和库⽂件经过链接器处理⽣成对应的可执⾏程序(.exe⽂件)

4.第一个C语言程序

#include <stdio.h>
int main()
{   
    printf("hello world\n");
    return 0;
}

多少程序员梦开始的地方

5.main函数

不管一个c语言程序有多少行代码,都是从main函数开始执行的,因此main函数也被叫做主函数.

main前面的int表示main函数执行结束时返回一个整型类型的值,所以在main函数的最后写return 0;正好前后呼应.

:

main函数是程序的⼊口

main函数有且仅有⼀个

即使⼀个项⽬中有多个.c⽂件,但是只能有⼀个main函数(因为程序的⼊⼝只能有⼀个)

容易犯的错:

main被写成了mian

main后边的()漏掉了 

代码中不能使⽤中⽂符号,⽐如括号和分号 

⼀条语句结束后,有分号

6.printf和库函数

在我们第一个c语言程序中有一行代码

printf("hello,world\n");

代码中使用了printf函数,实现了将信息打印在屏幕上,也就是那句hello world

在这里我们简单了解一下printf函数,它是一个库函数,功能是在标准输出设备(一般就是显示屏)上面进行信息的打印。上面那行代码就是用printf打印出了字符串。我们只需要将想要呈现在屏幕上的一串字符放在双引号中并传递给printf函数就可以打印。

当然,printf也可以用来打印其他类型的数据,具体我们在后面会详细讲到。

需要注意的是,我们在使用库函数(比如printf)的时候,是需要包含头文件的,比如printf这个库函数就需要包含stdio.h这个头文件,具体的方法就是

#include <stdio.h>

那库函数到底是什么呢?

为了不再重复实现常见的代码,让程序员提升开发效率,C语言标准规定了一组函数,这些函数再由不同的编译器厂商根据标准进行实现,提供给程序员使用。这些函数组成了一个函数库,被称为标准库,这些函数也被称为库函数。在这个基础上一些编译器厂商可能会额外扩展提供部分函数(这些函数其他编译器不一定支持)。
一个系列的库函数一般会声明在同一个头文件中,所以库函数的使用,要包含对应的头文件。库函数比较多,会在后面慢慢介绍。

7.关键字

C语言中有一些保留的名字符号,比如:intifreturn,这些符号被称为保留字或者关键字。我们需要注意的是

关键字都有特殊的含义,是保留给C语言使用的

我们自己在创建标识符的时候是不能和关键字重复的

关键字是不能自己创建的

在C语言中一共有32个关键字,如下

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

注:在c99标准中加入了inline、restrict、_Bool、_Complex、_Imaginary等关键字。

大家可以自己去了解一下,但是使用最多的还是表格中的32个,同样的,在后面这些关键字都会慢慢讲到

9.字符和ASCII编码

字符就是我们在键盘上敲出来的比如a、@、&等,这些都是字符,在C语言中字符是用单引号扩起来的,如‘a’、'@'

我们知道在计算机中所有的数据都是以二进制的形式存储的,那这些字符在内存中分别以什么样的二进制存储的呢?如果我们每个人自己给这些字符中的每个字符编一个二进制序列,这个叫做编码,每个人的编码都不一样,那不就乱套了,为了方便大家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了一个标准ASCII编码,C 语言中的字符就遵循了ASCII编码的方式。

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来指定格式:

#include <stdio.h>
int main()
{
    printf("%c\n",'Q');
    printf("%c\n",81);//这里81是字符Q是码值,也可以打印

    return 0;
}

9.字符串和\0

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

#include <stdio.h>
int main()
{
    printf("%s\n", "hello C");
    printf("hello c");
    return 0;
}

C语言字符串中一个特殊的知识,就是在字符串的末尾隐藏放着一个\0字符,这个\0字符是字符串的结束标志。

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

10.转义字符

在前面的代码中你会看到\0\n,这些就是转义字符。顾名思义,转义字符就是能够转变原来意思的字符。

举个例子,\n是一个转义字符表示换行的意思,我们可以简单理解为\n的意思发生了转变,n本来是一个普通的字符,被\转义为换行的意思。

C语言中其他转义字符如下:

\?:在书写连续多个问号时使用,防止他们被解析成三字母词,可惜这个在新的编译器上不能验证了。

\':用于表示字符常量'。

\":用于表示一个字符串内部的双引号。

\\:用于表示一个反斜杠,防止它被解释为一个转义序列符。

\a:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。

\b:退格键,光标回退一个字符,但不删除字符。

\f:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v

\n:换行符。

\r:回车符,光标移到同一行的开头。

\t:制表符,光标移到下一个水平制表位,通常是下一个4/8的倍数。

\v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。

下面两种转义字符可以理解为:字符的8进制或者16进制表示形式。

\ddd:d d d 表示1-3个八进制的数字。如:\130 表示字符X。

\xdd: d d表示2个十六进制的数字。如:\x30 表示字符0。

\0:null字符,代表没有内容,\0就是\ddd这类转义字符的一种,用于字符串的结束标志,其ASCII码值为0。

11.语句和语句分类

C语⾔的代码是由⼀条⼀条的语句构成的,C语⾔中的语句可为以下五类:

• 空语句

• 表达式语句

• 函数调⽤语句

• 复合语句

• 控制语句

11.1 空语句

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

   ;//空语句

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

11.2 表达式语句

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

b=a+5;//表达式语句

11.3 函数调用语句

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

printf("hehe\n");//函数调⽤语句
int  ret = Add(2, 3);//函数调⽤语句 

11.4 复合语句

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

#include <stdio.h>
void print(int  arr[], int  sz) //函数的⼤括号中的代码也构成复合语句
{
    int  i = 0;
    for(i=0; i<sz; i++)
{    printf("%d ", arr[i]);
}}
int main()
{
    int  i = 0;
    int  arr[10] = {0};
    for(i=0; i<10; i++) //for循环的循环体的⼤括号中的就是复合语句
     {18 arr[i] = 10-i;
        printf("%d\n", arr[i]); }
    return 0;
}

11.5 控制语句

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

可分成以下三类:

1. 条件判断语句也叫分⽀语句:if语句、switch语句;

2. 循环执⾏语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句。

后期会给⼤家⼀⼀介绍控制语句。

12.注释

注释是对代码的说明,编译器会忽略注释,也就是说,注释对实际代码没有影响。注释是给程序员⾃⼰,或者其他程序员看的。好的注释可以帮我们更好的理解代码,但是也不要过度注释,不要写没必要的注释。当然不写注释可能会让后期阅读代码的⼈抓狂。写注释⼀定程度上反应了程序作者的素质,建议⼤家写必要的注释。

12.1 注释的2种形式

第一种写法是将注释放在/*...*/之间,内部可以分行。

这种注释可以插在行内

/* 注释  */
/*
    这是⼀⾏注释
*/
    int fopen(char* s /* file name */, int  mode);

/**/ 的这个注释也不⽀持嵌套注释, /* 开始注释后,遇到第⼀个 */ 就认为注释结束了。

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

// 这是⼀⾏注释

int  x = 1; // 这也是注释

不管是哪⼀种注释,都不能放在双引号⾥⾯。双引号⾥⾯的注释符号,会成为字符串的⼀部分,解释为普通符号,失去注释作⽤。

13.2 注释会被替换

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

有什么问题欢迎大家评论区沟通

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐