C语言概述
本文将描述C语言的基本构成及其特点。
构成
①源程序由函数构成,每个函数完成相对独立的功能。
②每个源程序中必须有且只能有一个主函数,可以放在任何位置,但程序总是从主函数开始执行。
③函数体:在函数后面用一对花括号括起来的部分。
④每个语句以分号结束,但预处理命令、函数头之后不能加分号。
⑤注释:括在“ /* “ 与 “ */ ” 之间,没有空格,允许出现在程序的任意位置。
⑥预处理命令:以 # 开头的语句。
●自定义函数
库(Library)是指函数的集合,在磁盘中往往为一个文件夹。库函数(Library Function)指函数为C语言自带的集合,默认自带的有标准库,其他公司或个人开发的称为第三方库。
●主函数
一个程序必须有且只有一个main函数,它是程序的入口函数,程序从main函数开始,直到main函数结束。(当程序执行到return或函数末尾时,函数才结束)
●头文件
常用函数或库函数保存的文件,每个头文件包含若干类似功能的函数,调用头文件内函数时需引用,引用头文件有#include 命令。(早期C包含15个头文件[标准库] 如stdio.h stdlib.h)
从源代码生成可执行文件可分为四步:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)
用GCC编译流程如下图:
[Linux下]
[Windows下]
●预处理
主要处理源文件与头文件中以#开头的命令,如 #include #define #ifdef 等
一般规则如下:
①将所有的#define删除,展开所有宏定义
②处理所有条件编译命令,如#if #ifdef #elif #else #end 等
③将#include 所包含文件的内容插入当前位置,可递归
④删除所有注释 // /* */
⑤添加行号和文件名标识,便于调试时给出具体代码的位置
⑥保留所有#program 命令,因为编译器需要使用
●编译
将预处理完成的文件进行词法分析、语法分析、语义分析、优化分成相应的汇编代码文件。
●汇编
将汇编代码转化为可执行的机器指令
●链接
将引用的外部函数与变量的地址找到,将所有目标文件组织成一个可执行二进制文件。
C程序生成:一般先由源文件经编译生成目标文件,后经链接生成可执行文件。
常量、变量和数据类型
标识符:只能由字母、数字或下划线组成,第一个字符不能是数字、区分字母大小写。
标识符分类
关键字:C语言规定的专用标识符,有固定含义。
预定义标识符:和“关键字”一样有特定含义
用户标识符:由用户需要定义的标识符。(见名知义,不可与关键字相同)
常量
在程序运行中,其值不能被改变的量(整形常量、实型常量、字符常量、字符串常量、符号常量)
进制
进制位 | 表示范围 |
---|---|
十进制 | 基本数字范围0~9 |
八进制 | 以0开头,基本数字范围0~7 |
十六进制 | 以0x开头,基本数字范围0~ F (0~ 9,A~ F) |
形式
类别 | 表示形式 |
---|---|
小数形式 | 以小数点分隔左右两边为十进制数 |
指数形式 | e前必须有数字,e后必须为整数 |
用单引号括起来如’A’表示ASCII码字符集里的字符,即字符常量
用双引号括起来如“Hello”表示字符串
转义字符(特殊字符常量)以“\”打头,代表不同意思
字符 | 意义 |
---|---|
\n | 换行 |
\ | 反斜杠\ |
\ddd | 1~ 3位八进制数 代表一个ASCII字符 最大\177 |
\xhh | 1~ 2位十六进制数 代表一个ASCII字符 最大\7f |
符号常量 由预处理“#define”定义的常量,可用标识符表示的一个常量。
变量
值可以改变的量(整型变量、实型变量、字符变量) 使用前必须先定义变量名
说明 | 字符型 | 短整型 | 整型 | 长整型 | 单精度浮点型 | 双精度浮点型 | 无类型 |
---|---|---|---|---|---|---|---|
类型 | char | short | int | long | float | double | void |
32位环境下长度 | 1 | 2 | 4 | 4 | 4 | 8 |
强类型语言:一旦确定类型,就不能赋值到其他类型,除非转换数据类型,C语言属于强类型语言
弱类型语言:定义时不必指明数据类型,系统会自动推演类型
类型的自动转换和强制转换
自动转换规则(编译器自动进行的数据类型转换):
①按长度增加方向进行,以保证数值不失真,或精度不降低
②所有浮点运算以双精度进行,只有float也要转换为double才能运算
③char、short参与运算先转换为int
强制转换规则(程序员在代码中明确转换):
表达格式
(type_name)expression
(类型)(表达式)
用于防止数据失真,如两整数相除结果为小数时,需将两除数强制转换为小数以使得结果为小数。
版权声明
Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Scholar’s Blog博客,版权所有,侵权必究。
本文永久链接:https://scholargeek.github.io/2018/02/03/C%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A01/