本文为 《C Primer Plus 第五版》 读书总结

第三章总结

先上示例程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*rhodium.c --用金属铑衡量你的体重*/
#include <stdio.h>
int main(void) {
float weight;
float value;
printf("想知道你的体重值多少钱的金属铑嘛?\n");
printf("让我们来算算吧!\n");
printf("请键入你的体重:");
/* 从用户处获取输入 */
scanf("%f", &weight);
//假设金属铑每盎司770美元
//14.5883把常衡制的英镑转换为金衡制的盎司
value = 770 * weight * 14.5883;
printf("你的体重值%.2f的金属铑喔!\n",value);
return 0;
}
  • 此程序包含的新元素
  1. %.2f 精确控制输出到小数点后两位
  2. int整型变量
  3. float浮点变量 (即可使用带小数点的数)
  4. scanf()函数 可为程序提供键盘输入
  5. %f 指示scanf()从键盘上读取一个浮点数
  6. &weight将输入值赋予命为weight的变量中

常量和变量

  1. 程序需要使用数据,即承载信息的数字或字符
  2. 数据在整个程序中预先设置好且运行时无变化为常量
  3. 数据在程序运行时可能变化或被赋值的量为变量

数据类型关键字

如果是常量——直接书写
如果是变量——声明类型

C语言的数据关键字
原来的K&R关键字 C90关键字 C99关键字
int signed _Bool
long void _Complex
short _Imaginary
unsigned
char
float
double

解释:

int关键字提供C的基本整数类型
long short unsigned signed 这些为变种
char 用于表示字母以及其他字符,也可表示小的整数
float double和组合 long double表示带有小数点的数
_Bool 表示布尔值 (true or false)
_Complex_Imaginary分别表示复数和虚数

以上类型按计算机存储方式划分为:
整数(integer)类型
浮点数(floating-Point)类型

位、字节和字

  • 最小的存储单位:位 (bit)
  • 常用计算机存储单位: 字节(byte)
  • 自然的存储单位: 字 (word)

整数类型&浮点数类型

区别:他们的存储方式不同

  1. 整数 (没有小数部分的数)
  • 以二进制位存储
  1. 浮点数 (包含了整数之间的那些数)
    例:2.75 3.16E7 7.00

    加了小数点的数是浮点型值

  • 浮点数存储方式:将一个数分为小数部分和指数部分分别存储

两种类型在应用中的区别

  1. 整数没小数部分,浮点数有
  2. 浮点数可表示比整数范围大的多的数
  3. 对于一些算术运算,使用浮点数会损失更多精度
  4. 浮点数不能表示区域范围,只是实际值的近似
  5. 浮点运算通常比整数慢

C 数据类型

有符号类型

分正负的类型

  • 有符号类型最高数称为符号位
    • 1时 表示该数为负值
    • 0时 表示该数为正值

例:

  1. 一个字节 0111 1111 最高位0表示正号 则
    0111 1111 = + 111 1111 = +127
  2. 一个字节 1111 1111 最高位1表示负号 则
    1111 1111 = - 111 1111 = -127

无符号类型

无正负的类型

  • 其最高位的10和其他位一样,用来表示该数的大小

例:

  • 一个字节 1111 1111 = 255

∴无符号的一个字节表示的数据范围为:0~255 共256个

int类型

  • int类型是基本选择 (系统的基本整数类型)
  • C语言保证其至少有16位长
  • int类型是有符号类型 正负都可 取值范围依赖于计算机

声明int变量

1
2
int abc;
int dogs,cows,goats;

分开声明 合并声明均可

初始化变量

  • 初始化(initialize)变量就是为变量赋一个初始值
1
2
3
int dogs = 21;
int cows = 32,goats = 14;
int dogs,cows = 32; //此语句有效,但不建议使用

声明语句为变量创建,标定存储空间并为其制定初始值

打印int值

使用printf()函数打印
%d 为格式说明符(format specifier)用于指示在一行中的什么位置打印整数

注意:格式说明符的数目同待打印数目相同

八进制和十六进制

  • 前缀0x0X 表示使用十六进制值
  • 前缀0 表示使用八进制值

显示八进制数和十六进制数

  • 八进制显示整数 %o
  • 十六进制显示整数 %x

显示C语言前缀

使用格式说明符%#o %#x %#X 分别生成0 0x 0X前缀

1
2
3
4
5
6
7
8
// bases.c 以十进制、八进制和十六进制形式输出100
#include <stdio.h>
int main() {
int x = 100;
printf("十进制 = %d;八进制 = %o;十六进制 = %x \n",x,x,x);
printf("十进制 = %d;八进制 = %#o;十六进制 = %#x \n",x,x,x);
return 0;
}

输出结果:

1
2
十进制=100;八进制=144;十六进制=64
十进制=100;八进制=0144;十六进制=0x64

注意:要显示00x前缀必须在说明符中加入#符号!

其他整数类型

short int类型 (short类型)

  • 可能占用比int类型更少的存储空间,最大的short整数不大于最大的int整数值
  • 用于仅需小数值的场合以节省空间
  • 有符号类型
  • C语言保证其至少有16位长

long int类型 (long类型)

  • 可能占用比int类型更多的存储空间,此类型整数不小于最大int整数值
  • 用于使用大数值的场合
  • 有符号类型
  • C语言保证其至少有32位长

long long int类型 (long long类型)

  • 可能占用比long类型更多的存储空间,此类型整数不小于最大long整数值
  • 用于使用更大数值的场合
  • 有符号类型

unsigned int类型

  • 用于只使用非负值的场合
  • 可表示更大数值
  • 无符号类型

关键字signed可跟任何有符号类型一起使用,它使数据类型更明确

声明其他整数类型

1
2
3
4
5
6
7
8
9
long int abc;
long abc;
short int abc;
short abc;
unsigned int abc;
unsigned abc;
unsigned short abc;
unsigned long abc;
long long abc;

基本数据类型最小取值范围

16位单位

  • short类型和int类型最小取值范围: -32767~32767

32位单位

  • long类型最小取值范围:-2147483647~2147483647

unsigned short类型和unsigned int类型

  • 最小取值范围:0~65535

unsigned long类型

  • 最小取值范围:0~4294967295

long long类型

  • 最小取值范围:-9223372036875775807~9223372036875775807

unsigned long long类型

  • 最小取值范围:0~18446744073709551615

诸多整数类型中优先考虑 unsigned类型、没必要时不要使用long类型、如需64位整数,使用long long 类型、在int为32位系统时,如需使用16位的值,使用short类型可以节省存储空间

整数溢出

1
2
3
4
5
6
7
8
9
10
//toobig.c --超出您系统上的最大int值
#include <stdio.h>
int main() {
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d \n",i,i+1,i+2);
printf("%u %u %u \n",j,j+1,j+2);
return 0;

}

输出结果:

1
2
2147483647 -2147483648 -2147483647
4294967295 0 1

为什么会这样:无符号整数j当它达到最大值的时候,它将直接溢出到起始值也就是0,整数i道理相同,但是整数i属于有符号类型,它的起始值是-2147483648。但注意当i溢出它的最大值时,系统并没有给出提示

打印其他类型数

  • 打印unsigned int数字: %u
  • 打印 long 数值: %ld

若系统的intlong类型具有相同长度,可使用%d

  • 十六进制 long%lx
  • 八进制 long : %lo
  • short类型
    • %hd 十进制
    • %ho 八进制
    • %hx 十六进制
  • hl前缀可+u表示无符号类型
    • %lu unsigned long int
    • %hu unsigned short int
  • long long类型
    • %lld 有符号
    • %llu 无符号

格式说明符只能使用小写字母!

char类型

char类型用于存储字母和标点符号之类的字符,但其本身是整数类型
打印字符: %c
可使用:

  • unsigned
  • signed

声明

1
2
char abc;
char itable,latan;

若赋值一个字符给变量: 加单引号/写ASCII码

1
2
char grade = `A`
char grade = 65 //不建议

ASCII码和转义字符

计算机处理字符时使用ASCII码,标准ASCII码值范围:0~127
单引号技术适用于字符、数字、标点符号
动作描述使用转义序列或ASCII码

转义序列
序列 意义
\a 警报
\b 退格
\f 走纸
\n 换行
\r 回车
\t 水平制表位
\v 垂直制表位
\\ 反斜杠(\)
\' 单引号(`)
\" 双引号(”)
\? 问号(?)
\Ooo 八进制值(o表示一个八进制数字)
\xhh 十六进制(h表示一个十六进制数字)

ASCII码和转义字符之间,优先使用转义字符!它可使程序的可移植性更好!

总结完毕~