目录
1、什么是C语言
1972年,贝尔实验室的丹尼斯·里奇和肯·汤普逊在开发UNIX操作系统时设计了C语言,C语言是在B语言的基础上进行设计。C语言设计的初衷是将其作为程序员使用的一种编程工具,是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供供一种能以简易的方式编译、处理低级存储器、产 生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
1、C语言的优点
在学习c语言的过程中,会发现它有着许多优点:
1、设计特性:融合了计算机科学理论和实践的控制特性,让用户能轻松地完成自顶向下地规划,结构化编程和模块化设计
2、高效性:充分利用了当前计算机的优势,相对更紧凑,而且运行速度很快
3、可移植性:在一种系统编写的C层序稍作修改或不修改就能在其他系统运行
4、强大而灵活:功能强大且灵活的UNIX操作系统大部分就是用C语言写的
5、面向程序员:利用C可以访问硬件、操作内存中的位
有优点自然也有缺点,C语言的缺点是非常致命的:
C语言使用指针,指针的使用会给程序员带来许许多多不经意的错误,而程序员往往难以察觉到,从而造成程序崩溃等重大问题
3、语言标准
C语言发展之初,并没有所谓的C标准。1978年,布莱恩·柯林汉和丹尼斯·里奇合著的The C Programming Language(《C语言程序设计》)第一版是公认的C标准,通常称之为K&R C或经典C。随着C的不断发展,越来越广泛地应用于更多系统中,C社区意识到需要一个更全面、更新颖、更严格的标准。美国国家标准协会(ANSI)于1983年组建了一个委员会,开发了一套新标准,并于1989年正式公布。该标准(ANSI C)定义了C语言和C标准库。国际标准化组织于990年采用了这套C标准(ISO C)。ISO C和ANSI C是完全相同的标准。ANSI/ISO标准的最终版本通常叫做C89(C90)。另外,由于ANSI先公布C标准,因此业界认识通常使用ANSI C。1994年,ANSI/ISO联合委员会开始修改C标准,最终发布了C99标准。该委员会遵循了最初C90标准的原则,包括保持语言的精炼简单。委员会的用意不是在C语言中添加新特性,而是为了达到新的目标。
- 支持国际化编程
- “调整现有实践致力于解决明显的缺陷”
- 为适应科学和工程项目中的关键数值计算,提高C的适应性
标准委员会在2011年发布了C11标准,提出了新的指导原则。处于对当前编程安全的担忧,不那么强调“信任程序员”目标了。C99标准并没有被所有供应商接受和支持,这使得C99的一些特性称为C11的可选项。
4、使用C语言的步骤
第一步:定义程序的目标
在动手写程序之前,要在脑中有清晰的思路。想要程序去做什么首先自己要明确自己要做什么,思考你的程序需要哪些信息,要进行哪些计算和控 制,以及程序应该要报告什么信息。
第二步:设计程序
对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它。还要决定在程序(还可能是辅助文件)中如何表示数据,以及用什么方法处理数据。
第三步:编写代码
设计好程序后,就可以编写代码来实现它。
第四步:编译
编译源代码。
第五步:运行程序
最终生成的程序可通过单击或双击文件名或图标直接在操作系统中运行。
第六步:测试和调试程序
查找并修复程序错误的过程叫调试。
第七步:维护和修改代码
创建完程序后,你发现程序有错,或者想扩展程序的用途,这时就要修改程序。
5、第一个C语言程序
相信很多人第一个C语言都是著名的“hello world”吧,短短的几行代码,就像麻雀一样,虽小但五脏俱全。
看到这几行代码,初学者可能会觉得陌生,下面详细讲解一下这几个词是什么来的:
1、#include指令和头文件
作用:把stdio.h文件中的所有内容都输入该行所在的位置。实际上这是一种“拷贝-粘贴”的操作。是一条C预处理指令。通常C编译器在编译前会对源代码做一些准备工作,即预处理。所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使 用的输入和输出函数(如, printf())信息。该文件名的含义是标准输入/输 出头文件。通常,在C程序顶部的信息集合被称为头文件。
在大多数情况下,头文件包含了编译器创建最终可执行程序要用到的信息。stdio.h不是所有程序都包含,有一些程序没有用到。特定C实现的文档中应该包含对C库函数的说明。这些说明确定了使用哪些函数需要包含哪些头文件。
2、main()函数
int main(void)
这行代码标明该函数名为main。C程序一定是从main()函数开始执行(特殊例外情况不考虑在内)。除了main()函数,我们还可以任意命名其他函数,但main()函数有且仅有一个,是程序运行的开端。后续会学到更多的函数,但此处只需记得main()函数是程序的进口,有且仅有一个就行。
int是main()函数的返回类型,这表明main()函数返回的值是整数,返回的对象是操作系统,后续也会讲解这问题。
函数名后面的圆括号中包含一些传入函数的信息。该程序代码中并没有传递任何信息,因此圆括号里面内是单词void。也许我们可能看到过一些代码中的main()函数后面的圆括号并没有void,这是旧式C语言风格,C90标准接收这种形式11,但C99和C11标准不允许这种写。我们在浏览旧式代码的时候也许还会看到:void int()这种形式,理论上是成立的,但是我们写程序的时候最好不要这样写,因为这种写法一些编译器允许这样写,但是所有的标准都未认可这种写法。
当我们使用int main(void)这种标准形式写法,我们程序的可移植性将会得到大大的保障,把程序从一个编译器移到另一个编译器时就不会出现什么问题。
3、注释
在程序中,被/* */两个符号括起来的部分是程序的注释。写注释能让我们(包括他人)更容易明白我们自己所写的程序。注释可以放在任意地方,甚至我们写的代码和注释内容放同一行是没问题的。在/*和*/之间的内容都会被编译器忽略。
C99新增了另外一种风格的注释,普遍用于C++和Java。这种新风格使用//符号创建注释,仅限于单行。这种新注释是为了解决就形式注释存在的潜在问题。例如:
/* /* /0 */ * */ 1 --》允许嵌套注释 --》输出结果为1
/* / */0* /* */ 1 --》不允许嵌套注释 --》输出结果为0
有可能会出现 不想注释的内容给忽略 或 输出结果与预想结果不一致的可能 等错误情况
4、花括号、函数体和块
一般而言,所有的C函数都使用花括号标记函数提的开始和结束。这是规定,不能省略。只有花括号({})能起这种租用,原括号(())和方括号都不行([])。花括号还可用于把函数中的多条语句合并为一个单元或块。
5、声明
int num; 声明是C语言最重 要的特性之一。这个声明完成了两件事。其一,在函数中有一个名为 num的变量(variable)。其二,int表明num是一个整数(没有小数点或小数部分的数)。int是一种数据类型。编译器使用这些信息为num变量在内存中分配存储空间。分号在C语言中是大部分语句和声明的一部分。int是C语言的一个关键字(keyword),表示一种基本的C语言数据类型。关键字是语言定义的单词,不能做其他用途。
在C语言中,所有变量都必须先声明才能使用。这意味着必须列出程序中用到的所有变量名及其类型。C99和C11遵循C++的惯例,可以把声明放在块中的任何位置。首次使用变量之前一定要先声明它。
看到这里,初学者可能就有问题了,什么是数据类型?命名有什么规则吗?为什么要声明变量?
数据类型 :C 语言可以处理多种类型的数据,如整数、字符和浮点数。把变量声明 为整型或字符类型,计算机才能正确地储存、读取和解释数据。下一个知识点就是C语言中的各种数据类型详细讲解。
命名:给变量命名时要使用有意义的变量名或标识符
命名规则:可以使用小写字母、大写字母、数字和下划线(_)来命名。而且,名称的第一个字符必须是字符或下划线,不能是数字。
C语言的名称区分大小写,即把一个字母的大写和小写视为两个不同的字符。
声明变量的理由:把所有的变量放在一处,方便读者查找和理解程序的用途。如果变量名 都是有意义的,这样做效果很好。如果变量名无法 表述清楚,在注释中解释变量的含义。这种方法让程序的可读性更高;声明变量会促使你在编写程序之前做一些计划;声明变量有助于发现隐藏在程序中的小错误;如果事先未声明变量,C程序将无法通过编译。
6、赋值
num = 1;是赋值表达式语句。赋值是C语言的基本操作之一,该行代码的意思是“把值1赋给变量num”。在执行int num;声明时,编译器在计算机内存中为变量num预留了空间,然后在执行这行赋值表达式语句时,把值储存在之前预留的位置。该赋值表达式语句从右侧把值 赋到左侧。另外,该语句以分号结尾。
7、printf
使用了C语言的一个标准函数printf,圆括号表明printf是一 个函数名。圆括号中的内容是从main()函数传递给printf()函数的信息。printf()函数的\n字符并未输出,\n的意思是换行,代表着一个换行符。打印换行符的效果与在键盘按下Enter键相同,换行符会影响程序输出的显示格式。换行符一个转义序列,转义序列用于代表难以表 示或无法输入的字符。如,\t代表Tab键,\b代表Backspace键(退格键)。每 个转义序列都以反斜杠字符(\)开始。在后面我们将详细探讨一下。
参数中的%d在打印时有什么作用?
对比发现,参数中的%d被数字1代替了,而1就是变量num的值。%d相 当于是一个占位符,其作用是指明输出num值的位置。%提醒 程序,要在该处打印一个变量,d表明把变量作为十进制整数打印。printf() 82 函数名中的f提醒用户,这是一种格式化打印函数。printf()函数有多种打印 变量的格式,包括小数和十六进制整数。在后面我们将详细介绍。
8、return语句
return 0;int main(void)中的int表明 main()函数应返回一个整数。C标准要求main()这样做。有返回值的C函数要有return语句。该语句以return关键字开始,后面是待返回的值,并以分号结尾。如果遗漏 main()函数中的 return 语句,程序在运行至最外面的右花括号 (})时会返回0。因此,可以省略main()函数末尾的return语句。
6、关键字
关键字是C语言的词汇,它们对C而言比较特殊,不能用它们作为标识符。许多关键字用于指定不同的类型,如int。还有一些关键字用于控制程序中语句的执行顺序。
auto | extern | short | while |
break | float | signed | _Alignas |
case | for | sizeof | _Alignof |
char | goto | static | _Atomic |
const | if | struct | _Bool |
continue | inline | switch | _Complex |
default | int | typedef | _Generic |
do | long | union | _Imaginary |
double | register | unsigned | _Noreturn |
else | restrict | void | _Static_assert |
enum | return | volatile | _Thread_local |
如果使用关键字不当,编译器会将其视为语法错误。