C语言简介

C语言兼有高级语言和低级语言的特点

广泛应用于操作系统和应用软件的编写以及单片机和嵌入式系统的开发

C语言的产生

1963年,剑桥大学推出了CPL(Combined Programming Langurage)语言.

1967年,剑桥大学Matin Richards对CPL语言做了简化,推出了BCPL(Base Combined Programming Langurage)语言

1969年前后,贝尔实验室肯.兰.汤普森(Ken Lane Thompson)丹尼斯.麦卡斯利泰尔.里奇(Dennis MacAlistair Ritchie/DMR)的支持下,以BCPL为基础,对BCPL语言简化,设计出了很简单的而且很接近硬件的B语言(取BCPL的第一个字母),用来编写UNIX.
但B语言过于简单,功能有限.

1972年,DMR在B语言的基础上设计出了C语言,(取BCPL的第二个字母).C语言问世.
C语言保持了BCPL语言和B语言的优点(精练,接近硬件),又克服了他们的缺点(过于简单,数据无类型等)

1973年初,C语言的主体完成,Thompson和Ritchie开始用C语言重写UNIX

1977年,DMR发表了不依赖于具体机器系统的C语言编译文本<<可移植的C语言编译程序>>

1978年,美国电话电报公司AT&T(American Telephone & Telegraph)贝尔实验室正式发布C语言.同年布莱恩.威尔森.柯林汉(Brian Wilson Kernaghan)丹尼斯.麦卡斯利泰尔.里奇(Dennis MacAlistair Ritchie)合著了<<The C Programming Language>>一书,这本书被C语言开发者称为K&R,很多年来被开发者当做C语言的非正式标准说明.人们称这个版本的C语言为K&R C

C语言的标准

K&R C

起初,C语言没有官方标准.
1978年美国电话电报公司(AT&T)贝尔实验室正式发表C语言.
同年布莱恩·柯林汉(Brian Kernighan)丹尼斯·里奇(Dennis Ritchie)出版了一书<<The C Programming Language>>.
这本书被C语言开发者们称为K&R,很多年来被当作C语言的非正式的标准说明.人们称这个版本的C语言为K&R C

ANSI C/C89

1989年,为了避免个开发厂商用的C语言语法产生差异以及C语言能够健康发展下去,美国国家标准协会(American National Standards Institute/ANSI)通过了C语言标准.
因为这个标准是1989年通过的,所以简称C89标准.有些人也简称ANSI C,因为这个标准是美国国家标准协会(ANSI)发布的.

注:
ISO C/C90
1990年,国际标准化组织(International Organization for Standardization/ISO)国际电工委员会(International Electrotechnical Commission/IEC)把C89标准定一字不改的采纳为C语言的国际标准.

因为此标准是在1990年发布的,所以简称作C90标准.

不过大多数人依然称之为C89标准,因为此标准与ANSI C/C89标准完全等同.

ANSI C/C89和ISO C/C90内容基本相同,主要是发布的组织和时间不同.

C99

ANSI C标准确立之后,C语言的标准在很长一段时间内都没有较大的变动(出现过修订版本C94C95).
1999年1月,国际标准化组织(ISO)和国际电工委员会(IEC)发布了C语言的新标准C99.这是C语言的第二个官方标准.

C11

2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)再次发布了C语言的新标准C11,原名C1X.这是C语言的第三个官方标准,也是C语言的最新标准.

C语言特点

基本特性

  • 高级语言
    把高级语言的基本结构和语句与低级语言的实用性结合起来.

  • 结构式语言
    结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立.这种结构化方式可使程序层次清晰,便于使用,维护以及调试.具有多种循环,条件语句控制程序流向,从而使程序完全结构化.

  • 代码级别的跨平台
    由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows,DOS,UNIX等等,也适用于多种机型.
    C语言对编写需要进行硬件操作的场合,优于其它高级语言

  • 使用指针
    可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素.
    C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病.
    Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C.一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名.

特有特点

  • C语言是一个有结构化程序设计,具有变量作用域以及递归功能的过程式语言
  • C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value).
  • 不同的变量类型可以用结构体组合在一起
  • 只有32个保留字,使变量,函数命名有更多弹性
  • 部份的变量类型可以转换,例如整型和字符型变量.
  • 通过指针(pointer)C语言可以容易的对存储器进行控制
  • 编译预处理让C语言的编译更具有弹性

优点

  • 简洁紧凑,灵活方便
    C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写.
    把高级语言的基本结构和语句与低级语言的实用性结合起来.
    C语言可以像汇编语言一样对位,字节和地址进行操作,而这三者是计算机最基本的工作单元.

  • 运算符丰富
    C语言的运算符包含的范围很广泛,共有34种运算符.C语言把括号,赋值,强制类型转换等都作为运算符处理.从而使C语言的运算类型极其丰富,表达式类型多样化.
    灵活使用各种运算符可以实现在其它高级语言中难以实现的运算

  • 数据类型丰富
    C语言的数据类型有:整型,实型,字符型,数组类型,指针类型,结构体类型,共用体类型等.能用来实现各种复杂的数据结构的运算.
    并引入了指针概念,使程序效率更高.

  • 表达方式灵活实用
    C语言提供多种运算符和表达式值的方法,对问题的表达可通过多种途径获得,其程序设计更主动,灵活.
    它语法限制不太严格,程序设计自由度大,如对整型量与字符型数据及逻辑型数据可以通用等.

  • 允许直接访问物理地址,对硬件进行操作
    由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位(bit),字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件.

  • 生成目标代码质量高,程序执行效率高
    C语言描述问题比汇编语言迅速,工作量小,可读性好,易于调试,修改和移植.而代码质量与汇编语言相当.
    C语言程序生成的目标代码效率接近于汇编程序

  • 可移植性好
    C语言在不同机器上的C编译程序,代码几乎是公共的,所以C语言的编译程序便于移植.
    在一个环境上用C语言编写的程序,不改动或稍加改动,就可移植到另一个完全不同的环境中运行

  • 表达力强
    C语言有丰富的数据结构和运算符.
    包含了各种数据结构,如整型,数组类,、指针类型和联合类型等,用来实现各种数据结构的运算.
    C语言的运算符有34种,范围很宽,灵活使用各种运算符可以实现难度极大的运算.
    C语言能直接访问硬件的物理地址,能进行位操作.兼有高级语言和低级语言的许多优点
    C语言既可用来编写系统软件,又可用来开发应用软件,已成为一种通用程序设计语言.
    C语言具有强大的图形功能,支持多种显示器和驱动器.且计算功能,逻辑判断功能强大.

缺点

  • **C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别. **

  • **C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等.从应用的角度,C语言比其他高级语言较难掌握.也就是说,对用C语言的人,要求对程序设计更熟练一些. **

语言组成

基本构成

  • 数据类型
    C语言的数据类型包括: **C整型,字符型,实型或浮点型(单精度和双精度),枚举类型,数组类型,结构体类型,共用体类型,指针类型和空类型. **

  • 常量与变量
    常量其值不可改变,符号常量名通常用大写.
    变量是以某标识符为名字,其值可以改变的量.标识符是以字母或下划线开头的一串由字母,数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名.变量在编译时为其分配相应存储单元.

  • 数组
    如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明.字符串也是一种数组.要特别注意的是,方括内的索引值是从0算起的.

  • 指针
    如果一个变量声明时在前面使用*,表明这是个指针型变量.换句话说,该变量存储一个地址.
    C语言中有取地址运算符&,可以获取某变量在内存中的地址
    C语言中有指向运算符*,可以获取某内存地址里存储的内容.
    指针是C语言区别于其他同时代高级语言的主要特征之一.
    指针不仅可以是变量的地址,还可以是数组,数组元素,函数的地址.
    通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return仅能得到一个返回值.
    指针是一把双刃剑,许多操作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误.

  • 字符串
    C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行操作的函数.它们不同于字符数组.使用这些函数需要引用头文件<string.h>.

  • 输入/输出
    在C语言中,输入和输出是经由标准库中的一组函数来实现的.在ANSI C中,这些函数被定义在头文件<stdio.h>.

  • 运算
    C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言.在表达式方面较其它程序语言更为简洁,如自加,自减,逗号运算和三目运算使表达式更为简单.但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全.当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要.在学习中,对此合理进行分类,找出它们与数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟.
    先要明确运算符按优先级不同分类,运算符可分为15种优先级,从高到低,优先级为1 ~ 15.

关键字

关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字.例如关键字不能用作变量名,函数名等标识符
由ANSI标准定义的C语言关键字共32个
基本数据类型关键字
void char int float double
类型修饰符关键字
short long signed unsigned
复杂类型关键字
struct union enum typedef
存储类型关键字
auto static register extern const volatile
跳转结构关键字
return continue break goto
选择结构关键字
if else switch case default
循环结构关键字
for do while
判断数据类型占用字节数关键字
sizeof

  • 基本数据类型关键字
    void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果(C89新增)
    char:字符型类型数据,属于整型数据的一种(K&R引入)
    int:整型数据(K&R时期引入)
    float:单精度浮点型数据,属于浮点数据的一种(K&R引入)
    double:双精度浮点型数据,属于浮点数据的一种(K&R引入)

  • 类型修饰符关键字
    short:修饰int,短整型数据,可省略被修饰的int(K&R引入)
    long:修饰int,长整型数据,可省略被修饰的int(K&R引入)
    signed:修饰int,有符号数据类型(C89新增)
    unsigned:修饰int,无符号数据类型(K&R引入)

  • 复杂类型关键字
    struct:结构体声明(K&R引入)
    union:联合体声明(K&R引入)
    enum:枚举声明(C89新增)
    typedef:声明类型别名(K&R引入)

  • 存储类型关键字
    auto:指定为自动变量,由编译器自动分配及释放,通常在栈上分配.与static相反.当变量未指定时默认为auto(K&R引入)
    static:指定为静态变量,分配在静态变量区,修饰函数时指定函数作用域为文件内部(K&R引入)
    register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数.(K&R引入)
    extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.(K&R引入)
    const:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)(C89新增)
    volatile:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量.(C89新增)

  • 跳转结构关键字
    return:用在函数体中,返回特定值(K&R引入)
    continue:结束当前循环,开始下一轮循环(K&R引入)
    break:跳出当前循环或switch结构(K&R引入)
    goto:无条件跳转语句(K&R引入)

  • 选择结构关键字
    if:条件语句(K&R引入)
    else:if语句的否定分支,与if连用.(K&R引入)
    switch:分支语句.(K&R引入)
    case:分支语句中的分支标记,与switch连用.(K&R引入)
    default:分支语句中的''其他'分支,可选.(K&R引入)

  • sizeof:得到特定类型或特定类型变量占用字节大小(K&R引入)

语法结构

  • 顺序结构
    顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行.
    大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序

  • 选择结构
    顺序结构的程序虽然能解决计算,输出等问题,但不能做判断再选择.对于要先做判断再选择的问题就要使用选择结构.选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序.选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句,选择结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解.

  • 循环结构
    循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环,while循环,do while循环和for循环.四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误.
    特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环.
    三个循环的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while循环和for就可能一次都不执行.另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和continue语句进行控制的.
    顺序结构,分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环,顺序结构,其实不管哪种结构,均可广义的把它们看成一个语句.在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长,结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构.

程序结构

C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写
因此常说:C程序=主函数+子函数.
对函数的定义调用,值的返回等中要尤其注重理解和应用

  • 选择结构
    if语句
    switch语句

  • 循环结构
    while语句
    do-while语句
    for语句

  • 跳转语句
    goto语句
    break语句
    continue语句
    return语句

函数

函数是一个自我包含的完成一定相关功能的执行代码段.
一个C程序中必须至少有一个函数,而且其中必须有一个并且仅有一个以main为名,这个函数称为主函数.整个程序从这个主函数开始执行.
C 语言程序鼓励和提倡把一个大问题划分成一个个子问题,对应于解决一个子问题编制一个函数,因此C语言程序一般是由大量的小函数而不是由少量大函数构成的,即所谓"小函数构成大程序".
这样的好处是让各部分相互充分独立,并且任务单一.因而这些充分独立的小模块也可以作为一种固定规格的小"构件",用来构成新的大程序.
C语言在发展的同时也积累了很多能直接使用的库函数.
ANSI C提供了标准C语言库函数.
C语言初学者比较喜欢的Turbo C 2.0提供了400多个运行时函数,每个函数都完成特定的功能,用户可随意调用.这些函数总体分成输入输出函数,数学函数,字符串和内存函数.与BIOS和DOS有关的函数,字符屏幕和图形功能函数,过程控制函数,目录函数等.
Windows系统所提供的Windows SDK中包含了数千个跟Windows应用程序开发相关的函数.
其他操作系统,如Linux,也同样提供了大量的函数让应用程序开发人员调用.
作为程序员应尽量熟悉目标平台库函数其功能.这样才能游刃有余地开发特定平台的应用程序.比如作为Windows应用程序的开发者,应尽量熟悉Windows SDK;作为Linux应用程序开发者,应尽量熟悉Linux系统调用和POSIX函数规范.

运算符

C运算符优先性与结合性.jpg

注:

  • 一个C程序可以由一个或多个文件组成.
  • 每个文件可由一个或多个函数组成
  • 一个程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数.main函数是整个程序的入口.
  • 源程序中可以有预处理命令
  • 每一个声明,每一个语句都必须以分号结尾.(结构体,联合体,枚举型的声明的"}"后要加分号.
    但预处理命令,函数头和复合语句的"}"之后不能加分号.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容