今天刚刚翻看了自己当初学习 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’ 等。