C语言基础
一、什么是c语言?
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,拥有经过了漫长发展历史的完整的理论体系,在编程语言中具有举足轻重的地位,我们所熟知的c++,JAVA,Python,都是从c中衍生出来的语言。
语言的变迁:
二、认识第一个c语言程序
2.1在屏幕上打印出“Hello world”
C 程序主要包括以下部分:
预处理器指令
函数
变量
语句 & 表达式
注释
代码如下:
#include<stdio.h>//这是编译预处理指令
int main()//定义主函数
{ //函数开始的标志
printf("Hello world\n");//输出所指定的一行信息
return 0;//函数执行完毕时返回的函数值为0
}//函数结束的标志
2.2 程序分析
2.2.1 空白和注释
注释方法有如下三种:
/*
**第一种
*/
//第二种
#if 0
第三种
#endif
2.2.2 预处理指令( 预处理命令以符号“#”开头)
1.宏定义
1.不带参数的宏定义:宏定义又称为宏代换、宏替换,简称“宏”。
格式:
#define标识符文本
其中的标识符就是所谓的符号常量,也称为“宏名”。
预处理(预编译)工作也叫做宏展开:将宏名替换为文本(这个文本可以是字符串、可以是代码等)
即在对相关命令或语句的含义和功能作具体分析之前就要换:
例:
#define MAX 100
把程序中全部的标识符MAX换成100
说明:
(1)宏名一般用大写
(2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。
(3)可以用#undef命令终止宏定义的作用域
(4)宏定义可以嵌套
2.带参数的宏:
除了一般的字符串替换,还要做参数代换
格式:
#define 宏名(参数表) 文本
例如:#define S(a,b) a * b
area=S(3,2);
第一步被换为area=a * b;
第二步被换为area=3 * 2;
(1)实参如果是表达式容易出问题
#define SQUARE( x ) x * x
int a = 5;
printf("%d\n" ,SQUARE( a + 1) );
结果是printf ("%d\n",a + 1 * a + 1 );答案是11 你以为是36
正确的宏定义是#define SQUARE(x) (x) * (x)
(2)宏名和参数的括号间不能有空格
(3)宏替换只作替换,不做计算,不做表达式求解
(4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存
(5)宏的哑实结合不存在类型,也没有类型转换。
(6)宏展开使源程序变长,函数调用不会
(7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)
2.文件包含
一个文件包含另一个文件的内容
格式:
#include “文件名” OR #include <文件名>
编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。
编译以后只得到一个目标文件.obj
被包含的文件又被称为“标题文件”或“头部文件”、“头文件”,并且常用.h作扩展名。
修改头文件后所有包含该文件的文件都要重新编译
头文件的内容除了函数原型和宏定义外,还可以有结构体定义,全局变量定义:
(1)一个#include命令指定一个头文件;
(2)文件1包含文件2,文件2用到文件3,则文件3的包含命令#include应放在文件1的头部第一行;
(3)包含可以嵌套;
(4)<文件名>称为标准方式,系统到头文件目录查找文件,
"文件名"则先在当前目录查找,而后到头文件目录查找;
(5)被包含文件中的静态全局变量不用在包含文件中声明。
3.条件编译
有些语句希望在条件满足时才编译。
格式:(1)
#ifdef 标识符
程序段1
#else
程序段2
#endif
//当标识符已经定义时,程序段1才参加编译。
#ifdef
程序段1
#endif
格式:(2)
#ifndef 标识符
#define 标识1
程序段1
#endif
//如果标识符没有被定义,则重定义标识1,且执行程序段1。
格式:(3)
#if 表达式1
程序段1
#elif 表达式2
程序段2
……//当表达式1成立时,编译程序段1,当不成立时,编译程序段2
#elif 表达式n
程序段n
#else
程序段n+1
#endif
使用条件编译可以使目标程序变小,运行时间变短。
预编译使问题或算法的解决方案增多,有助于我们选择合适的解决方案。
此外,还有布局控制:#pragma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。
2.2.3 main函数
main是函数的名字,表示“主函数",main前面的int表示此函数的类型是int类型(整型)。在执行主函数后会得到一个值(即函数值),其值为整型。“return 0;"的作用是:当main函数执行结束前将整数0作为函数值返回到调用函数处。每一个C语言程序都必须有一个main函效。是C编译系统提供起来。printf是输出函数。\n是换行符,即在输出"Hello world.”后,显示屏上的光标位置移到下一行的开头。这个光标位置称为输出的当前位置,即下一个输出的字符出现在此位置上。每个语句最后都有一个分号,表示语句结束。
2.2.4 标识符
C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
C 标识符内不允许出现标点字符,比如 @、$ 和 %。C 是区分大小写的编程语言。因此,在 C 中,Max 和 max 是两个不同的标识符。
2.2.5 关键字
下表列出了 C 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
关键字 | 说明 |
---|---|
auto | 声明自动变量 |
break | 跳出当前循环 |
case | 开关语句分支 |
char | 声明字符型变量或函数返回值类型 |
const | 声明只读变量 |
continue | 结束当前循环,开始下一轮循环 |
default | 开关语句中的"其它"分支 |
do | 循环语句的循环体 |
double | 声明双精度浮点型变量或函数返回值类型 |
else | 条件语句否定分支(与 if 连用) |
enum | 声明枚举类型 |
extern | 声明变量或函数是在其它文件或本文件的其他位置定义 |
float | 声明浮点型变量或函数返回值类型 |
for | 一种循环语句 |
goto | 无条件跳转语句 |
if | 条件语句 |
int | 声明整型变量或函数 |
long | 声明长整型变量或函数返回值类型 |
registe | r 声明寄存器变量 |
return | 子程序返回语句(可以带参数,也可不带参数) |
short | 声明短整型变量或函数 |
signed | 声明有符号类型变量或函数 |
sizeof | 计算数据类型或变量长度(即所占字节数) |
static | 声明静态变量 |
struct | |
switch | 用于开关语句 |
typedef | 用以给数据类型取别名 |
unsigned | 声明无符号类型变量或函数 |
union | 声明共用体类型 |
void | 声明函数无返回值或无参数,声明无类型指针 |
volatile | 说明变量在程序执行中可被隐含地改变 |
while | 循环语句的循环条件 |
三、数据类型
在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
C 中的类型可分为以下几种:
序号 | 类型与描述 |
---|---|
1 | 基本类型:它们是算术类型,包括两种类型:整数类型和浮点类型。 |
2 | 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
3 | void 类型: 类型说明符 void 表明没有可用的值。 |
4 | 派生类型: 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。 |
3.1 整数类型
下表列出了关于标准整数类型的存储大小和值范围的细节:
类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节 | -128 到 127 或 0 到 255 |
unsigned char | 1 字节 | 0 到 255 |
signed char | 1 字节 | -128 到 127 |
int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字节 | -32,768 到 32,767 |
unsigned short | 2 字节 | 0 到 65,535 |
long | 4 字节 | -2,147,483,648 到 2,147,483,647 |
unsigned long | 4 字节 | 0 到 4,294,967,295 |
注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主
我们可以用sizeof()来计算类型大小
下面是大小的换算
3.2 浮点类型
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
float | 4 字节 | 1.2E-38 到 3.4E+38 | 6 位小数 |
double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位小数 |
long double | 16 字节 | 3.4E-4932 到 1.1E+4932 | 19 位小数 |