C 语言是一种通用的、面向过程式的计算机程序设计语言。
C 语言最初是用于系统开发工作,特别是组成操作系统的程序。由于 C 语言所产生的代码运行速度与汇编语言编写的代码运行速度几乎一样,所以采用 C 语言作为系统开发语言。 从下列的应用实例也可以看出C语言作为系统开发语言的特性:
- 操作系统
- 语言编译器
- 汇编器
- 文本编辑器
- 打印机
- 网络驱动器
- 现代程序
- 数据库
- 语言解释器
- 实体工具
Hello,world代码分析
#include <stdio.h>
int main{
/* 我的第一个 C 程序 */
printf("Hello, World! \n");
return 0;
}
- 程序的第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h (标准输入输出头)头文件。如果没有找到 stdio.h 头文件,会发生编译错误。
- 所有的 C 语言程序都需要包含 main()主函数。 代码从 main() 函数开始执行。int是返回值的类型
- /* ... */ 用于注释说明。
- printf() 用于格式化输出到屏幕。printf() 函数在 "stdio.h" 头文件中声明。
- return 0; 语句用于表示退出程序,然会值类型必须与main前的类型声明一致,否则编译错误。
编译 & 执行 C 程序
- 文本编辑器编写上述代码。
- 保存文件为 hello.c,.c是C的源代码文件。
- 打开命令提示符,进入到保存文件所在的目录。
- 键入 gcc hello.c,编译代码。
- 生成 a.out 可执行文件,键入 a.out 来执行程序。
- 屏幕上打印输出"Hello World"。
单个C源文件编译执行命令示例:
gcc hello.c
./a.out
输出:Hello, World!
多个C源文件编译执行命令示例:
$ gcc test1.c test2.c -o main.out
$ ./main.out
C令牌(Tokens)
C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。
分号
在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。
注释
单行注释://
多行注释:/* */,这种格式的注释可以单行或多行。
标识符
C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。标识符由字母、数字和下划线组成,而且只能以字母和下划线开头。C 是区分大小写的编程语言。
关键字
这些保留字不能作为常量名、变量名或其他标识符名称。
关键字 | 说明 |
---|---|
auto | 声明自动变量 |
break | 跳出当前循环 |
case | 开关语句分支 |
char | 声明字符型变量或函数返回值类型 |
const | 声明只读变量 |
continue | 结束当前循环,开始下一轮循环 |
default | 开关语句中的"其它"分支 |
do | 循环语句的循环体 |
double | 声明双精度浮点型变量或函数返回值类型 |
else | 条件语句否定分支(与 if 连用) |
enum | 声明枚举类型 |
extern | 声明变量或函数是在其它文件或本文件的其他位置定义 |
float | 声明浮点型变量或函数返回值类型 |
for | 一种循环语句 |
goto | 无条件跳转语句 |
if | 条件语句 |
int | 声明整型变量或函数 |
long | 声明长整型变量或函数返回值类型 |
register | 声明寄存器变量 |
return | 子程序返回语句(可以带参数,也可不带参数) |
short | 声明短整型变量或函数 |
signed | 声明有符号类型变量或函数 |
sizeof | 计算数据类型或变量长度(即所占字节数) |
static | 声明静态变量 |
struct | 声明结构体类型 |
switch | 用于开关语句 |
typedef | 用以给数据类型取别名 |
unsigned | 声明无符号类型变量或函数 |
union | 声明共用体类型 |
void | 声明函数无返回值或无参数,声明无类型指针 |
volatile | 说明变量在程序执行中可被隐含地改变 |
while | 循环语句的循环条件 |
新增加关键字
_Bool | _Complex | _Imaginary | inline | restric |
_Alignas | _Alignof | _Atomic | _Generic | _Noreturn |
_Static_assert | _Thread_local |
C中空格
只包含空格的行,被称为空白行,会被编译器完全忽略
空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束。为了增强可读性,表达式的标识符、运算符等之间添加空格
C 数据类型
变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。C 中的类型可分为以下几种:
序号 | 类型与描述 |
---|---|
1 | 基本类型: 算术类型,包括两种类型:整数类型和浮点类型。 |
2 | 枚举类型: 算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
3 | void 类型: 类型说明符 void 表明没有可用的值。 |
4 | 派生类型: 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。 |
数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。
整数类型和浮点类型
标准整数类型的存储大小和值范围的细节(32位和64位):
float,单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。
double,双精度浮点值。双精度是1位符号,11位指数,52位小数。
使用sizeof 运算符。表达式 sizeof(type) 得到对象或类型的存储字节大小。
示例:
#include <stdio.h>
#include <float.h>
#include <limits.h>
int main()
{ //%lu 为 32 位无符号整数
printf("int 存储大小 : %lu \n", sizeof(int));
printf("float 存储最大字节数 : %lu \n", sizeof(float));
//%E 为以指数形式输出单、双精度实数
printf("float 最小值: %E\n", FLT_MIN );
printf("float 最大值: %E\n", FLT_MAX );
printf("精度值: %d\n", FLT_DIG );
return 0;
}
void 类型
void 类型指定没有可用的值,表示类型的缺失。它通常用于以下三种情况下:
序号 | 类型与描述 |
---|---|
1 | 函数返回为空 C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status); |
2 | 函数参数为空 C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void); |
3 | 指针指向 void 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。 |
类型转换
1、数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型;在 C 语言中也可以对数据类型进行强制转换;
2、自动转换规则:
- a)浮点数赋给整型,该浮点数小数被舍去;
- b)整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中;
3、强制类型转换形式: (类型说明符)(表达式)
C变量和常量
变量其实只不过是程序可操作的存储区的名称。常量是指程序在运行时其值不能改变的量。常量不占内存,在程序运行时它作为操作对象直接出现在运算器的各种寄存器中,又称作字面量。变量是指在程序运行时其值可以改变的量。变量的功能就是存储数据。标识符应做到‘顾名思义’。
变量定义
语法:
//仅定义
type variable_list;
//或定义并初始化(指定一个初始值)
type variable_name = value;
对于不带初始化值的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
变量声明
变量的声明有两种情况:
- 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
- 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
- 除非有extern关键字,否则都是变量的声明加定义。
若要一个源文件中引用另外一个源文件中定义的变量,我们只需在需要引用的文件中将变量加上 extern 关键字的声明。
整数常量用0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
浮点常量由整数部分、小数点、小数部分和指数部分组成。
字符常量是括在单引号中,例如,'x' 可以存储在 char 类型的简单变量中。
字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。使用空格做分隔符,把一个很长的字符串常量进行分行。下列字符串字面值是显示相同的:字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符。使用空格做分隔符,把一个很长的字符串常量进行分行。下列字符串字面值是显示相同的
:
"hello, dear"
"hello, \
dear"
"hello, " "d" "ear"
常量的定义
C 中,有两种简单的定义常量的方式:
- 使用 #define 预处理器。 #define identifier value;
- 使用 const 关键字。: const type variable = value;
常量常常更应该定义为大写字母形式。