2020/7/2
永远不要假设计算机为你假设了任何前提(Never assume the computer assumes anything)。
变量
-
程序运行中,数值可以变化的数据内存。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TtIGaIii-1594831557934)(D:/%E9%BB%91%E9%A9%AC/fzs%E7%9A%84%E7%AC%94%E8%AE%B0/day02%E7%AC%94%E8%AE%B0/1593654007990.png)]
-
三要素:
- 变量名
- 变量类型
- 变量值
int var = 10;
var =5;//数值变了
格式化输出in
printf("%d\n",var);
常量
-
在程序运行中不允许修改。
-
常量语法:
-
数值常量:字符串常量“heillo”、字符常量‘a’、整形常量10、实型(浮点型)3.1415926
-
宏定义常量
#define MAX 100 //#define 宏名 宏值 //注意 1、使用空格隔分,不使用 = 2、没有;结束标志 3、通常 宏名 为大写字符
-
const定义常量
const int a = 10;
限制a变量为可读,不可修改。
-
标识符
- 标识符是变量和常量的统称。
- 使用规范:
- 语法规范:
- 不能使用关键字、库函数名。
- 只能使用字母、数字、下划线。
- 只能字母或下划线开头,不能用数字开头。
- 大小写区分。
- 命名习惯
- 通常采用大写 命名常量,小写命名 变量。
- 较长时:
- 大驼峰法: int ThisIsATestForVar = 10;
- 小驼峰法:int thisIsATestForVar = 10;
- 小写+下划线:int this_is_a_test_for_var =10;
- 语法规范:
C语言数据类型
计算机存储知识
- 一个二进制,叫做一个比特位。 bit
- 内存的最小单位为——内存单元-——一个字节 1byte = 8bit
- 硬盘的最小单位为扇区——512字节 = 0.5KB.
sizeof关键字
- 作用:用来求一个变量、数据类型占用的内存空间的大小 ——单位是字节
- 方法:
sizeof(int); int a = 10; sizeof(a);
- 它不是函数,而是关键字。
整型
有符号整型
- 能用来表示正负号的数据值。 ——摄氏度
整型名 | 名称 | 格式匹配符 | 占用的大小 | 最小值 | 最大值 |
---|---|---|---|---|---|
int | 整型 | %d | 4字节 | -2147483648 | 2147483647 |
short | 短整型 | %hd | 2字节 | -32768 | 32767 |
long | 长整型 | %ld | windows: 32/64位:4字节; Linux下:32位:4字节、64位:8字节。 | -2147483648 | 2147483647 |
long long | 长长整型 | %lld | 8字节 | -9223372036854775808 | 9223372036854775807 |
- 查看有符号整型的取值范围,要借助#include <limits.h>头文件使用其中的宏名
- 各种类型占用的内存空间大小 使用sizeof关键字 32位程序中,使用 %u 显示空间大小
#include <stdio.h>
#include <limits.h> // 此头文件中的 宏 记录着各种数据类型的 最大、最小值。
int main(void)
{
// sizeof(int) 得到的大小应该为 4,该4的类型为 unsigned int。因此 用 %u显示。
printf("int类型占用的内存大小:%u\n", sizeof(int));
// sizeof(short) 得到的大小应该为 2,该2的类型为 unsigned int。因此 用 %u显示。
printf("short类型占用的内存大小:%u\n", sizeof(short));
printf("long类型占用的内存大小:%u\n", sizeof(long));
printf("long long类型占用的内存大小:%u\n", sizeof(long long));
printf("\n ----------------华丽分割线-----------------\n");
// 查看各种数据类型的,取值范围
printf("int:min = %d, max = %d\n", INT_MIN, INT_MAX);
printf("short:min = %hd, max = %hd\n", SHRT_MIN, SHRT_MAX);
printf("long:min = %ld, max = %ld\n", LONG_MIN, LONG_MAX);
printf("long long:min = %lld, max = %lld\n", LLONG_MIN, LLONG_MAX);
system("pause");
return 0;
}
无符号整形
- 数值没有负数,只有 ”数值“。 ——没有正负之 ——年龄
整型名 | 名称 | ||||
---|---|---|---|---|---|
unsigned int | 无符号整型 | %u | 4字节 | 0 | 4294967295 |
unsigned short | 无符号短整型 | %hu | 2字节 | 0 | 65535 |
unsigned long | 无符号长整型 | %lu | windows: 32/64位:4字节 Linux下:32位:4字节、64位:8字节。 | 0 | 4294967295 |
unsigned long long | 无符号长长整型 | %llu | 8字节 | 0 | 18446744073709551615 |
- 求无符号整型,占用的内存大小和取值范围
#include <stdio.h>
#include <limits.h>
// 获取无符号整型大小、取值范围
int main(void)
{
//sizeof(unsigned int) 得到的大小为 4,该4的类型为 unsigned int。因此用 %u显示。
printf("unsigned int内存大小:%u\n", sizeof(unsigned int));
printf("unsigned short内存大小:%u\n", sizeof(unsigned short));
printf("unsigned long内存大小:%u\n", sizeof(unsigned long));
printf("unsigned long long内存大小:%u\n", sizeof(unsigned long long));
printf("unsigned int:min=0, max = %u\n", UINT_MAX);
printf("unsigned short:min=0, max = %hu\n", USHRT_MAX);
printf("unsigned long:min=0, max = %lu\n", ULONG_MAX);
printf("unsigned long long:min=0, max = %llu\n", ULLONG_MAX);
return 0;
}
其他知识
- 没有限定类型的整数,默认为 int 类型。c
123 // int ---- %dc
- 可以使用后缀标识 指定的整数类型。
123U 或 123u // unsigned int
123ul 或 123UL // unsigned long
123ull 或 123ULL // unsigned long long
123L 或 123l // long
数值溢出
-
参照日常生活中,小时、分钟、秒 理解数值溢出。
-
种类:
- 上溢出:最大值 + 1 ——> 最小值
- 下溢出:最小值 -1 ——> 最大值
-
当前我们所接触到的大多数系统的编译器,采用处理方式 : 无符号 和 有符号等同。
结论
- 不允许在编写的C语言程序中,使用数值溢出的特性。—— 因为不同编译处理方式可能不同。
- 在编写程序时,需要预见到数据溢出发现的可能性。—— 选择正确的数据类型使用。
字符型
- 字符型:占用1字节大小。
- 有符号:char
- 专用格式匹配符:%hhd (通常用 %d 较多,%hd也可以用)
- 取值范围:-128 - 127
- 无符号:unsigned char
- 专用格式匹配符:%hhu
- 取值范围:0 ~ 255
- 有符号:char
ASCII码
- 是无符号的整数。取值范围 0 ~ 255。 常用 0 ~ 127
本质
- 每个 char 类型的数据,本质都是一个 “数值”。该数值,称之为 ASCII 码。该数值 代表一个唯一的字符。
- 给 char 变量赋值。查看:
- 查看数值:%hhd、%d、%hd
- 查看对应的字符:%c
常用ASCII码
-
‘0’ : ASCII 表值 为 48
-
‘a’ : ASCII 表值 为 97
-
‘A’ : ASCII 表值 为 65
-
‘\0’ : ASCII 表值 为 0
-
‘\n’ : ASCII 表值 为 10
-
‘\t’ : ASCII 表值 为 9
-
注意:
- ‘a’ 字符 a 和 “a” 字符串 a—— 不同!
- abc’ 既不是一个字符,也不是一个字符串——错误书写!
转义字符
- ‘\’ 反斜杠,表示转义字符。
- 转义字符的作用:
- 将普通字符转换为特殊意义
- 如: n —> \n, t —> \t, 0 —> \0
- 将特殊字符转换为本身意。
- 将普通字符转换为特殊意义
浮点型(实型)
常用浮点型
-
float:单精度浮点型。 %f 默认保留6位小数。 大小:4字节 —— sizeof(float) 可求。
-
double:双精度浮点型。%lf 默认保留6位小数。 大小:8字节—— sizeof(double) 可求。
float v1 = 3.14f;
// 不加 f, 直接 3.14, 默认为 double 类型。
- loat 和 double 不存在 unsigned 类型。只有 有符号类型。
// 浮点型基本使用
int main(void)
{
float v1 = 4.135324f;
double v2 = 1.45479802;
printf("v1 = %.2f\n", v1);
printf("v2 = %.3lf\n", v2); // 保留3位小数,对第4位四舍五入。
// 共显示8位数(包含小数点),不足8位用 空格 填充。保留3位小数,对第4位四舍五入。
printf("v2 = %8.3lf\n", v2);
// 共显示8位数(包含小数点),不足8位用 0 填充。保留3位小数,对第4位四舍五入。
printf("v2 = %08.3lf\n", v2);
return EXIT_SUCCESS;
}
精度问题
-
产生精度问题的原因:计算机底层实现浮点数时,采用的是 “近似值” 方法实现。
-
浮点数取值范围,不需要讨论,因为精度问题。
-
精度:c
- float: 精度范围 6 ~ 7 位。
- 整数部分 + 小数部分 <= 6位,准确。
- 整数部分 + 小数部分 = 7位,可能准确, 也可能不准确。
- 整数部分 + 小数部分 > 7位,准确率极低。
- double:精度范围 15 ~ 16 位。
- 整数部分 + 小数部分 <= 15位,准确。
- 整数部分 + 小数部分 = 16位,可能准确, 也可能不准确。
- 整数部分 + 小数部分 > 16位,准确率极低。
- float: 精度范围 6 ~ 7 位。
隐式类型转换
- 由编译器自动完成的转换。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7zWAx8o-1594831557948)(day02%E7%AC%94%E8%AE%B0.assets/1593679273633.png)]
#define PI 3.1415f
int r = 3;
PI * r * r; // 此表达式,将 float 类型 和 int 类型做运算。转换为 double
//float 与float相互运算时,为避免丢失精度,结果类型提升为double类型
2.有赋值产生。
float s = PI * r * r;
// 表达式为 double, s类型为 float。 当赋值时 将 double 类型转换为 float
- 小数据类型 —> 大数据类型: 一定没问题。
- 大数据类型 —> 小数据类型:可能没问题,也可能有问题。
强制类型转换
- 强转变量 —— (目标类型) 变量名
- 强转表达式 —— (目标类型) 表达式
#include <stdio.h>
int main(void)
{
float price = 3.4; // 黄瓜单价。
int weight = 4; // 斤数
int sum1 = weight * (int)price; // 强转变量
printf("4斤黄瓜总价为:%d\n", sum1);
int sum2 = (int)(weight * price); // 强转 表达式
printf("4斤黄瓜总价为:%d\n", sum2);
return 0;
}
编程练习
1.使用 printf 结合 %d 格式匹配符,在屏幕上显示算式:10 + 20 = 30
#include <stdio.h>
int main(void)
{
int a = 10, b = 20;
printf("%d + %d = %d\n", a, b, a + b);
return 0;
}
2.已知矩形长为 3.426, 宽为1.728。编写程序求矩形面积。要求输出面积结果,保留2位小数,对第3位做四舍五入
#include <stdio.h>
int main(void)
{
float a = 3.426;
float b = 1.728;
printf("该矩形面积为:%.2f", a * b);
return 0;
}
3.编写程序,依次输出int、short、unsigned int 、unsigned short 数据类型占用空间的大小,及的取值范围
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("int类型占用空间的大小为:%u\n", sizeof(int));
printf("short类型占用空间的大小为:%u\n", sizeof(short));
printf("unsigned int类型占用空间的大小为:%u\n", sizeof(unsigned int));
printf("unsigned short类型占用空间的大小为:%u\n", sizeof(unsigned short));
printf("int类型的取值范围为: %d -- %d\n", INT_MIN, INT_MAX);
printf("short类型的取值范围为: %hd -- %hd\n", SHRT_MIN, SHRT_MAX);
printf("unsigned int类型的取值范围为: %u -- %u\n", 0, UINT_MAX);
printf("unsigned short类型的取值范围为: %hu -- %hu\n", 0, USHRT_MAX);
return 0;
}
4.已知 ‘k’ 的ASCII码为107。编程,根据 ‘k’ 的ASCII码值,计算出 ‘o’ 的ASCII值,打印输出。
#include <stdio.h>
int main(void)
{
char ch1 = 'K', ch2 = 'O';
int cha = ch2 - ch1;
printf("'o'的ASCII的值为%d\n", 107 + cha);
return 0;
}