The standard of C language(K&R C,ANSI C,C89,C90,C99)

 C语言的标准(K&R CANSI CC89C90C99

历史

l  C语言1973年由Dennis M. Ritchie设计和实现。

l  K&R C1978年由KernighanRitchie合写的书《The C Programming Language》,形成了C语言的事实的标准,简称为K&R C

l  ANSI CC89C901989年,美国国家标准局(ANSI)颁布了第一个官方的C语言标准(X3.159-1989),简称为ANSI CC891990年,它被国际标准化组织(ISO)采纳国际标准(ISO/IEC9899:1990),简称为C90。这个标准是目前广泛使用并完全支持的。

l  C991999年,ISO/ANSI又推出了新的标准(ISO9899:1999),简称C99。这个标准目前支持的可能还不太全面。

C89/C90标准的指导原则是:

l  相信程序员;

l  不妨碍程序员做需要完成的事情;

l  让语言保持短小简单;

l  只提供一种方法来执行一种操作;

l  使程序运行速度快,即使不能保证其可移植性。(不追求定义的抽象统一,更优先考虑运行效率)

C89/C90K&R C的改变有:

l  增加了函数原型(prototype),强调对函数的输入参数进行严格的类型检查;并补充定义了C语言的标准函数库

l  删除了关键字:entry(条目/入口)

l  增加了关键字:const(常型变量)、enum(枚举类型)、signed(有符号的,例如signed char)、void(空/无,可用于函数返回值和形参、通用指针类型)、volatile(易变变量,防止编译器错误的优化)

l  传递结构:允许将结构本身作为参数传递给函数(原来只允许传地址)

l  函数原型:增加了函数原型(便于编译器进行类型检查)

l  增加了预处理指令:#elifelse if)、#error(错误,强制编译停止)、#line(修改当前行号和源文件名)、#pragma(附注/编译指令,编译器定义的与实现有关的指令)

l  定义了固有宏:__LINE__(当前行号)、__FILE__(源文件名)、__DATE__(当前系统日期)、__TIME__(当前系统时间)、__STDC__(标准C版时为1

C99的修订目标主要有三点:

l  支持国际化编程,引入了支持国际字符集Unicode的数据类型和库函数;

l  修正原有版本的明显缺点。如整数的移植方法,例如int8_tint16_tint32_tint64_t等类型;

l  针对科学和工程的需要,改进计算的实用性。例如添加了复数类型和新数学函数。

C99标准的新特性

C99是在C89Ansi C)的基础上发展起来的,增加了基本数据类型,关键字 ,和一些系统函数等。目前完全支持的有这些:MinGWBorland C++dev-C++

相对于c89的变化包括

l  增加restrict指针

l  inline(内联)关键字

l  新增数据类型 _Bool

l  对数组的增强: 可变长数组

l  可以单行注释

l  分散代码与声明

l  预处理程序的修改

l  复合赋值

l  柔性数组结构成员

l  指定的初始化符

l  printf()scanf()函数系列的增强

l  C99新增的库

n  C89中标准的头文件

u  <assert.h> 定义宏assert()

u  <ctype.h> 字符处理

u  <errno.h> 错误报告

u  <float.h> 定义与实现相关的浮点值勤

u  <limits.h> 定义与实现相关的各种极限值

u  <locale.h> 支持函数setlocale()

u  <math.h> 数学函数库使用的各种定义

u  <setjmp.h> 支持非局部跳转

u  <signal.h> 定义信号值

u  <stdarg.h> 支持可变长度的变元列表

u  <stddef.h> 定义常用常数

u  <stdio.h> 支持文件输入和输出

u  <stdlib.h> 其他各种声明

u  <string.h> 支持串函数

u  <time.h> 支持系统时间函数

n  C99新增的头文件和库

u  <complex.h> 支持复数算法

u  <fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问

u  <inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数

u  <iso646.h> 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏

u  <stdbool.h> 支持布尔数据类型类型。定义宏bool,以便兼容于C++

u  <stdint.h> 定义标准的、可移植的整型类型集合。该文件包含在<inttypes.h>

u  <tgmath.h> 定义一般类型的浮点宏

u  <wchar.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数

u  <wctype.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数

l  __func__预定义标识符

l  其它特性的改动

放宽的转换限制

 

限制 C89标准 C99标准

数据块的嵌套层数 15 127

条件语句的嵌套层数 8 63

内部标识符中的有效字符个数 31 63

外部标识符中的有效字符个数 6 31

结构或联合中的成员个数 127 1023

函数调用中的参数个数 31 127

 

不再支持隐含式的int规则etc…

pseudocode

伪码

n  伪码pseudocode是一种人工的、非正式的辅助人们尽心该算法设计的语言;

n  伪码与我们日常使用的英语极为类似,虽然伪码不是一种真正的计算机程序设计语言,但是它易学、易懂,书写方便;

n  伪码不能在计算机上执行,只是帮助我们在用计算机程序设计语言编写程序前思考程序应该如何设计;

n  伪码只包含字符,所以可以很方便地用一个文本编辑器来编辑伪码程序;

n  精心设计的伪码很容易转换为相应的C程序;

n  伪码程序只包含关于行为语句的语句指那些当伪码转换为C程序后,在C程序中执行的那些操作。对于变量定义,它不是行为语句,只是程序员想传递给编译器的信息,可以不用出现在伪码中;

n  有些程序员会在伪码的开始处列出所有的变量,并简要说明其目的;

 

怎样从函数返回多个值

怎样从函数返回多个值

l  怎样从函数返回多个值(利用极坐标到直角坐标的转换做例子)

n  1.传入多个指针指向不同的地址,让函数填入需要返回的值

u  clip_image002

n  2.让函数返回包含需要值的结构

u  clip_image003

n  结合指针和结构,让函数接收结构指针,然后再填入需要的数据

u  clip_image004

n  不得已的时候,可以使用全局变量,但是这个方法不推荐,GOD晓得有没有可能在多线程的其他程序中会修改全局变量,所以这是迫不得已时采用的方法。