今天刚刚翻看了自己当初学习C语言时候的笔记,发现感触挺深的,正好这个时候正是自己的复习阶段,就拿过来复习一下吧
第一个C语言程序
程序:为解决特定的问题而用计算机语言编写的有序指令序列的集合
#include<stdio.h>
int main(void){
printf("Hello World");
return 0;
}
这个程序需要回答以下几个问题:
程序是如何执行的 ?
- 编辑:通过程序员的编写,形成源代码文件,源代码文件包括两个部分:
源文件(.c)(>=1个)头文件(.h)(>=0个)
。源文件和头文件在实际目录中是在同一层目录之下的,而我们在编译器中看到的则是一个虚拟目录,自动分成的目录。 - 编译:通过编译将源文件翻译成
二进制文件目标文件(.obj)
,进行语法错误
的检查。编译过程中,是以源文件
为基本单位的。 - 链接:将编译的到的所有的目标文件通过链接形成唯一的一个
可执行性的文件(.exe)
。 - 执行:得到程序运行的结果
- 调试
(debug)
也是一个环节,但对于个别小程序来讲,调试不是必须的过程。
对上面程序是如何理解的 ?
- 上面程序中用到了头文件,头文件也叫预处理文件,由
标识符#、预处理指令include和头文件
组成。#include是预处理指令
,它的作用是将指定的头文件内容放到预处理指令的所在位置。 - 头文件是一个标准的函数库,头文件名用来指名你使用的库函数所在的文件名,程序中使用
printf库函数
包含在stdio.h
里(stdio表示standard input/output)
。 - 头文件的执行是通过源文件来执行的,头文件不参与编译过程,头文件有两种形式:
<>表示系统文件
,即表示预处理的文件从系统规定的位置寻找头文件""表示当前目录下的头文件
,即表示预处理的文件先从当前目录下进行寻找,若通过,继续进行下面的编译,若没有再从系统中寻找头文件。 -
main
函数是可执行程序的入口函数。一个C程序
有且只有一个main函数
。
变量
问题的求解需要用到算法,算法主要有以下几个特征:
- 有穷性
- 确切性
- 可行性
- 一个算法有零个或多个输入
- 一个算法有一个或多个输出
变量的定义:
- 程序中通过数据类型定义变量来表示自己需要的数据,可以给
内存中一块连续的空间
起一个名字,通过这个名字来操作它,这个名字就是变量名
,也叫做标识符
。 - 变量定义必须放在变量使用之前。一般放在函数体的开头部分。
变量声明的基本语法:
/*数据类型 变量名1, 变量名2 …, 变量名n;*/
int a;// 定义了一个变量a,a的数据类型是int型
变量命名的规范:
- 变量名由
数字,字母和下划线_
组成 - 数字
不能打头
- 不能使用C语言中的
关键字
- C语言的变量名中的字母
区分
大小写 - 变量名应该尽量有意义,参考编程规范
变量的赋值:
变量可以先定义再赋值,也可以在定义的同时进行赋值;在定义变量的同时赋初值称为初始化
。
注意,在定义中不允许连续赋值,如a=b=c=5是不合法的
。
常考试题:
( D
)是合法的用户自定义标识符。
A.case
(关键字) B.123f
(数字) C. #html5
(符号) D. _int
数据类型
整型数据
整型数据的分类和范围
-
short
2
个字节 -
int
2/4
个字节(8位和16位系统是2字节,32位系统是4字节,64位系统还是4字节) -
long
4/8
个字节(除了64位系统是8字节,其他都是4字节) -
long long int
或long long
8
个字节 (VC6.0不支持,是在C99中添加的)
整型数据可以分为符号型和无符号型
,前缀带有unsigned
的都是无符号型。在同一个编译器和系统下,有符号
和无符号
表示的字节都是相同的
。
不同的系统必须满足sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)
各类型长度:
// short int
short int(2字节占16位) :-(2^15-1)~(2^15-1),即-32767~32767
unsigned short int(2字节占16位):0~(2^16-1),即0~65535
// int
int(32/64位系统,4字节占32位):-(2^31-1)~(2^31-1),即-2147483647 ~2147483647
unsigned int(32/64位系统,4字节占32位):0~(2^32-1),即0 ~ 4294967295
// long int
long int(非64位系统,4字节占32位):-(2^31-1)~(2^31-1),即-2147483647 ~2147483647
unsigned long int(非64位系统,4字节占32位):0~(2^32-1),即0 ~ 4294967295
long int(64位系统,8字节占64位):-(2^63-1)~(2^63-1),即 -9223372036854775807~9223372036854775807
unsigned long int(64位系统,8字节占64位):0~(2^64-1),即 0~18446744073709551615
// long long int
long long int(8字节占64位):-(2^63-1)~(2^63-1),即 -9223372036854775807~9223372036854775807
unsigned long long int(8字节占64位):0~(2^64-1),即 0~18446744073709551615
无符号类型长度总比有符号类型长度多一位
,比如16位int是±2^15-1,16位unsigned int却是2^16-1
,是因为有符号整型
需要一个位
去作为符号位,用于表示正负,所以少一位;而无符号整型不需要符号位,所有位全部用于表示整数。
整型数据在内存中存放的方式
- 在内存中数值是以
补码
的形式存储的 - 有符号整数在内存中的存储
正数
:原码、补码、反码相同负数
: 原码:数值的二进制表示 反码:符号位不变,数值的二进制按位取反 补码:数值的反码加1
整型数据的表示方法
- 十进制数:十进制数没有前缀。其数码为0~9。
以下是合法的十进制数
:237、-568、65535、1627
以下是不合法的十进制数
:023 (不能有前导0)、23D (非十进制数码)。 - 八进制数:八进制数必须以
0
开头,即以0
作为八进制数的前缀。数码取值为0~7
。八进制数通常是无符号数
。
以下是合法的八进制数
:015(十进制为13)、0101(十进制为65)、0177777(十进制为65535);
以下是不合法的八进制数
:256(无前缀0)、03A2(包含了非八进制数码)、-0127(出现了负号)。 - 十六进制数:十六进制数的前缀为
0X或0x
。其数码取值为0~9,A~F或a~f
。
以下是合法的十六进制数
:0X2A(十进制为42)、0XA0 (十进制为160)、0XFFFF (十进制为65535);
以下是不合法的十六进制数
:5A (无前缀0X)、0X3H (含有非十六进制数码)。
字符型数据
字符型数据是用单引号
括起来的一个字符。例如:'a'、'b'、'='、'+'、'?'
都是合法字符型数据。
- 字符型数据
只能用单引号
括起来,不能用双引号或其它括号。 - 字符型数据
只能是单个字符
,不能是字符串。 - 字符可以是字符集中任意字符。但数字被定义为字符型之后就
不能参与数值运算
。如'5'
和5
是不同的。'5'是字符型数据,不能参与运算。
转义字符
转义字符是一种特殊的字符。转义字符以反斜线"\"
开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称 “转义” 字符。
转义字符主要用来表示那些用一般字符不便于表示的控制代码:
转义字符 | 转义字符的意义 | ASCII代码 |
\n |
回车换行 | 10 |
\t |
横向跳到下一制表位置 | 9 |
\b |
退格 | 8 |
\r |
回车 | 13 |
\f |
走纸换页 | 12 |
\\ |
反斜线符"" | 92 |
\' |
单引号符 | 39 |
\" |
双引号符 | 34 |
\a |
鸣铃 | 7 |
\ddd |
1~3位八进制数所代表的字符 | |
\xhh |
1~2位十六进制数所代表的字符 |
字符类型说明符
字符变量的类型说明符是char
。字符变量类型定义的格式和书写规则都与整型变量相同。例如:char a,b;
每个字符变量被分配一个字节
的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。
由ASCII码可以看出:
- 小写的ASCII码比大写的ASCII码大
32
,常用的a为97 A为65
- 后面的ASCII码比前面的ASCII码大
-
'3'
要变化成3
需要'3'-'0'=3
字符串
字符串是由一对双引号
括起的字符序列。例如: "CHINA" ,"C program" , "$12.5"
等都是合法的字符串。
字符串和字符不同,它们之间主要有以下区别:
- 字符由单引号括起来,字符串由双引号括起来。
- 字符只能是单个字符,字符串则可以含一个或多个字符。
- 可以把一个字符型数据赋予一个字符变量,但不能把一个字符串赋予一个字符变量。
- 字符占
一个字节
的内存空间。字符串占的内存字节数等于字符串中字节数加1
。增加的一个字节中存放字符"\0"
(ASCII码为0)。这是字符串结束
的标志。
实型数据
实型数据类型指的就是浮点数或实数
实型数据类型的分类
类型说明符 | 比特数(字节数) | 有效数字 | 数的范围 |
---|---|---|---|
float |
32(4) | 6~7 | -10^38~10^38 |
double |
64(8) | 15~16 | -10^308~10^308 |
由以上内容可以看出:
- 实型数据没有办法精确的表示所有数字,因此表示的范围大
- 相邻两个数据的距离是不等距的
- 每一种实型数据都有自己的有效位数和精度
实型数据的表示
- 十进制数形式:由数码
0~9
和小数点
组成。 例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230 等均为合法的实数。注意,必须有小数点。
- 指数形式:由十进制数,加阶码标志
"e"
或"E"
以及阶码(只能为整数,可以带符号)组成。其一般形式为:a E n(a为十进制数,n为十进制整数)
其值为a*10^n
。如:2.1E5
(等于2.1*10^5
)3.7E-2
(等于3.7*10^-2
)
实型数据在内存中的表示
前面的符号位很容易判断为0或者是1,指数部分称之为阶码
,这个阶码部分是由偏置值(127或1111111)和阶码真值
相加得到的,阶码真值符合IEEE-754
标准,这个标准规定了是这个数一定能写成1.--*2的多少次方
的形式,尾数部分的存储是原码的存储
。
常量和字面值
常量
常量 | 说明 |
---|---|
直接常量(字面量) | 可以立即拿来用,无需任何说明的量。 |
符号常量 | 用标识符代表一个常量。#define 标识符 常量
|
const 常量 |
const int x=3.14; |
字面值
- 整型常量的类型:一般默认整型常量为
int
型。也可以根据其值所在范围或后缀确定其数据类型
长整型字面值 123L 23l
无符号整型字面值 123U 123u
无符号长整型字面值 123UL 123ul
long long型字面值 123ll 123LL
- 浮点型字面值:默认为
double
型,也可以使用后缀f,F,l,L
确定类型。
求字符串的长度
字符串字面值是由一对双引号括起来的字符序列(以'\0'
结束)。
- 字符串字面值会自动在字符串最后加上
'\0'
,占据一个字节的内存。 - 求字符串长度的时候注意
转义字符占据一个字节
,例如:'\xdd'
等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。