C语言学习---C语言概述

1.C语言简介


1.1编程语言发展简史


1.机器语言时期(1842年~约1970年)
2.汇编语言时期(1946~今)
3.高级编程语言前期(1957~今)
                  C语言的发明人Dennis Ritchie丹尼斯·里奇 同时也是Unix系统的发明人之一,因此C语言搭借操作系统而全球风靡
                  1973年里奇和肯·汤普逊  Ken Thompson  用c重写了unix,自此相辅相成
                  1978年正式发表c语言,Brian W. Kernighan【布莱恩·克尼汉】  和 Dennis Ritchie 同时出版一本书 The C Programming Language, K&R非正式标准
                  1982,c标准委员会,c89    c99    c11

4.高级编程语言后期(1980~今)
    1980年,Alan Kay创造了Smalltalk并发明了“面向对象”这个词。不过对于当时的程序员来说,“面向对象”这个词过于抽象难以理解。
    1983年,Bjarne Stroustrup对C语言进行的大幅度的升级,将“面向对象”的概念嫁接到C语言上,创造出了C++语言。
    1986年,Brad Cox和Tom Love创造了Objective-C。
    1991年,荷兰程序员Guido van Rossum发明了Python语言。
    1990年,James Gosling发明了Oak编程语言,该语言在1995年改名为Java。James Gosling也被称为“Java之父”。

5.自然语言编程

1.2编程语言的发展流程

       编程语言从发明至今,大致分为机器语言阶段、汇编语言阶段、高级编程语言阶段和自然语言阶段。
       机器语言 -----> 汇编语言 -----> 高级编程语言 -----> 自然语言
       难--------------------------------------------------->简单
       与电脑亲和度高--------------------------------->与电脑亲和度低
       底层------------------------------------------------>高层

1.3高级语言分类

 通常情况下,我们可以按照编程语言的运行方式,将编程语言分为:

 编译型编程语言(如C、C++等)
        解释型编程语言(如Python等脚本语言,以及Linux下的Shell编程)
        还可以按照编程语言的发展先后顺序或者编程语言的属性,将编程语言分为:


         面向过程的编程语言(较少,如C语言、Pascal语言)
         面向对象的编程语言(较多,目前广泛应用)


1.4 C语言

1)通过以上分类可以知道,C语言属于面向过程的编译型编程语言
       2)C语言是美国Dennis Ritchie在1972年设计发明的,C语言主体诞生于1973年,正式发行于1977年
       3)C语言经历过几个修订版本,其中影响比较大的是1989年修订的C89版与1999年修订的C99版。C89版也是当代C语言通行的基础版本
       4)C语言主要用于编写操作系统内核、底层驱动程序、小型应用程序、数据库等,借助操作系统,C语言长期处于编程语言排行榜前几位的位置。

 

 

2 编写简单的C程序:HelloWorld

 

2.1 编写简单的C程序HelloWorld


//文件hello.c
#include
int main()
{
    printf("Hello World!\n");
    return 0;
}

程序讲解:
#include:标准I/O头文件,下文中的printf需要使用这个文件
main():主函数,一个程序的入口。一个程序有且只有一个main()函数
int:代表主函数的返回值类型是int型
printf():格式化输出,将括号内的内容打印到显示器上,打印字符串需要用双引号""引上
return 0;:配合主函数类型使用,一般来说返回0的程序表示程序运行成功

2.2 使用编译器GCC把程序代码变成可执行程序


GCC(GNU C Compiler)是Linux系统内一款开源的C语言编译器,具有强大的功能,被称为“世界上最好用的C语言编译器”。
使用gcc将hello.c编译为可执行程序
gcc hello.c -o hello
-o的作用:指定生成的产物的名字。如果不加-o和名字,则gcc会默认生成a.out文件
同时,可以使用Make工程管理器编译
make hello    //等价于gcc hello.c -o hello
此时会调用系统默认的Makefile,编译hello.c生成hello。

编译成功后,
执行该程序:
./hello(./a.out)


 

2.3 C语言从代码变成可执行程序的编译步骤


在进行编译时,C语言代码会经过预处理、编译、汇编、链接4个步骤
预处理 -----> 编译 -----> 汇编 -----> 链接
⒈预处理:去掉注释,加载头文件,代替宏定义,条件编译
需要文件:.c文件
生成产物:预处理文件(以.i结尾)
使用方法:gcc hello.c -E -o hello.i
可以使用vim打开预处理文件来查看生成产物
⒉编译:使用编译器进行C语言的语法检查,如果有语法错误,报错,并结束编译过程;如果没有语法错误,把C的源程序转变为汇编代码
需要文件:.i文件
生成产物:汇编文件(以.s结尾)
使用方法:gcc hello.i -S -o hello.s
可以使用vim打开汇编文件来查看生成产物
⒊汇编:把汇编源文件通过汇编器生成目标文件(二进制机器语言)
需要文件:.s文件
生成产物:机器码(或称为“目标代码”,以.o结尾)
使用方法:gcc hello.s -c -o hello.o
可以使用vim打开目标代码文件来查看生成产物(不过只会看到乱码)
⒋链接:把目标文件执行所依赖的所有二进制的其他目标文件及C的库文件都整合成一个可执行文件的过程
需要文件:.o文件及各种动态库或静态库
生成产物:可执行程序
使用方法:gcc hello.o -o hello


 

3 标识符、关键字、变量、常量


3.1 标识符


标识符:用于标识变量名、符号常量名、函数名、类型名、文件名等的有效字符序列;
1)标识符的命名规则:
⒈标识符只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线;
⒉C语言中的标识符大小写敏感;
⒊用户自定义的标识符不能与关键字同名;

练习:下列哪些标识符是合法的?哪些是不合法的?不合法的标识符错误在哪?
Arena、 2ndtest、 arena  s_count、marks40、oh!god、 class_one、start... end、int

3.2 关键字


关键字:对编译器具有特定含义的标识符,是标识符的一个特殊的集合。C语言内所有的关键字都是小写。
/*******************************C语言关键字*****************************************/
1、基本数据类型
void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。(C89标准新增)
char:字符型类型数据,属于整型数据的一种。(K&R时期引入)
int:整型数据,表示范围通常为编译器指定的内存字节长。(K&R时期引入)
float:单精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
double:双精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
//_Bool:布尔型(C99标准新增)
//_Complex:复数的基本类型(C99标准新增)
//_Imaginary:虚数,与复数基本类型相似,没有实部的纯虚数(C99标准新增)
//_Generic:提供重载的接口入口(C11标准新增)
2、类型修饰关键字
short:修饰int,短整型数据,可省略被修饰的int。(K&R时期引入)
long:修饰int,长整型数据,可省略被修饰的int。(K&R时期引入)
//long long:修饰int,超长整型数据,可省略被修饰的int。(C99标准新增)
signed:修饰整型数据,有符号数据类型。(C89标准新增)
unsigned:修饰整型数据,无符号数据类型。(K&R时期引入)
//restrict:用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式。(C99标准新增)
3、复杂类型关键字
struct:结构体声明。(K&R时期引入)
union:联合体声明。(K&R时期引入)
enum:枚举声明。(C89标准新增)
typedef:声明类型别名。(K&R时期引入)
sizeof:得到特定类型或特定类型变量的大小。(K&R时期引入)
//inline:内联函数用于取代宏定义,会在任何调用它的地方展开。(C99标准新增)
4、存储级别关键字
auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认为auto。(K&R时期引入)
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。(K&R时期引入)
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。(K&R时期引入)
extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(K&R时期引入)
const:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)。(C89标准新增)
volatile:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量。(C89标准新增)
5、流程控制关键字
1)跳转结构
return:用在函数体中,返回特定值(如果是void类型,则不返回函数值)。(K&R时期引入)
continue:结束当前循环,开始下一轮循环。(K&R时期引入)
break:跳出当前循环或switch结构。(K&R时期引入)
goto:无条件跳转语句。(K&R时期引入)
2)分支结构
if:条件语句,后面不需要放分号。(K&R时期引入)
else:条件语句否定分支(必须与if连用)。(K&R时期引入)
switch:开关语句(多重分支语句)。(K&R时期引入)
case:开关语句中的分支标记,与switch连用。(K&R时期引入)
default:开关语句中的“其他”分支,可选。(K&R时期引入)
for:循环(K&R时期引入)
while:循环(K&R时期引入)
/*******************************C语言关键字end**************************************/


3.3 变量


变量必须先定义,再使用
//定义变量相当于在内存中开辟内存空间,未开辟内存空间无法使用
定义一个int型变量:
int a;//定义一个int型变量
定义一个char型变量:
char c;//定义一个char型变量
注意:定义变量不要重名,而且在选择变量名和其它标识符时,应注意做到“见名知意”,即选有含意的英文单词(或其缩写)作标识符。

定义变量后,需要给变量赋值
//在C语言中,未初始化的局部变量为乱码,因此使用之前需要事先给值
a = 10;//给int型变量赋值需要整数
c = 'A';//给char型变量赋值需要字符
有时为了书写简便,可以直接在定义变量时赋值。
int a = 10;
char c = 'A';
这种在定义时就直接赋值的使用方法称为“初始化”。
变量之间也可赋值,如:
int a = 10;
int b;
b = a;//将a中存放的值赋值给b

 

3.4 常量

    
常量:在程序执行过程中,其值不被改变的量。常量主要分为两类:
    直接常量:直接引用的数字等;
    符号常量:使用标识符来代替一个数字(常见的:宏定义常量 和 常变量)
1)宏定义
宏定义:又称为宏代换,是定义一个标识符来代表一个值或一个表达式。宏定义常见有不带参宏与带参宏两类
         1.不带参宏
          #define 宏名 宏值
         例如:
         #define MAX 10
         #define PI 3.1415926

        2.带参宏
       与不带参宏不同,带参宏会在宏名之后携带参数列表
       #define 宏名(参数列表) 宏值
       例如:
       #define S(r) PI*r*r

 

使用宏定义的优点:
    1.给数值赋予一定含义,增强代码可读性
    2.减少代码编写量
    3.可以“一改全改”

2)常变量
常变量:变量值不可改变的量,使用const修饰
const int a = 10;//定义一个常变量
注意:
const修饰后的变量会变成只读,因此无法再次赋值。因此初始化常变量需要在定义时直接赋值。
常变量与宏定义常量的区别:
宏定义常量是在预处理阶段,使用宏名来代替宏值。而常变量是在程序运行时,程序在内存分配的一个变量,只不过变量不允许再次赋值。
 

你可能感兴趣的:(C语言学习---C语言概述)