C Primer Plus学习笔记(二)- 数据和C
从一个简单的程序开始
#include <stdio.h>int main(void)
{float weight;float value;printf("Please enter your book's weight:");scanf("%f", &weight); //用户输入value = 17 * weight * 14.5833;printf("Your book's weight is %f and value is %.2f\n", weight, value);return 0;
}
程序运行结果
程序提示输入,156为输入的值,输入完成后要按Enter键,按Enter键是告诉计算机,你已经完成输入数据。
scanf("%f", &weight):scanf()函数用于读取键盘的输入,%f告诉scanf()函数要读取用户从键盘输入的浮点数,&weight告诉scanf()函数把输入的值赋给变量weight,scanf()函数使用&符号表明找到weight变量的地址。
scanf()函数读取用户从键盘输入的数据,并把数据传递给程序,printf()函数读取程序中的数据,并把数据显示在屏幕上。
printf()函数用%f来处理浮点值,%.2f中的“.2”用于精确控制输出,指定输出的浮点数只显示小数点后两位。
有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些数据类型称为常量。17,14.5833就是常量。
其他数据类型在程序运行过程中可能会改变或被赋值,这些数据类型成为变量。weight,value就是变量。
位、字节和字:
位(bit)是最小的存储单位,可以存储0和1,或者说,位用于设置“开”或“关”,位是计算机内存的基本构建块。
字节(byte)是常用的计算机存储单位,1字节为8位,1位可以表示0或1,那么8位字节就有256(2的8次方)种可能的0、1的组合。
字(word)是设计计算机时给定的自然存储单位,计算机的字长越大,其数据转移越快,允许的内存访问也更多。
整数和浮点数:
和数学的概念一样,在C语言中,整数是没有小数部分的数,计算机以二进制数字储存整数。
浮点数和整数的储存方案不同,计算机把浮点数分成小数部分和指数部分来表示,而且分开来储存这两部分,7.00和7的值是一样的,但是储存方式不同。
在十进制中。可以把7.0写成0.7E1,0.7是小数部分,E后的1是指数部分。
计算机在内部使用二进制和2的幂进行储存,而不是10的幂。
2.75,3.16E7,7.00,2e-8都是浮点数,3.16E7表示3.16*107 ,7被称为指数。
整数和浮点数的区别:
整数没有小数部分,浮点数有小数部分。
浮点数可以表示的范围比整数大。
对于一些运算,浮点数损失的精度更多。
计算机的浮点数不能表示区间内所有的值,浮点数通常只是实际值的近似值。
int类型:
int类型是有符号的整型,int类型的值必须是整数,可以是正的,也可以是负的,也可以是0。
ISO C规定int的取值范围最小为-32768~32767。
声明int变量:先写上int,然后写变量名,最后加上一个分号
int weight; //声明一个int类型的变量
int weight, height; //声明多个int类型的变量
然后可以通过直接赋值给变量赋值,也可以通过函数给变量赋值
weight = 200; //直接赋值给变量scanf("%d", &weight); //通过函数赋值
初始化变量:初始化变量就是为变量赋一个初始值。
在C语言中,初始化可以直接在声明中完成。在变量名后面加上赋值运算符(=)和待赋值给变量的值。
int one = 1;int two =2, three = 3;int four, five = 5;
第3行中的four并没有被赋值,只有five被赋值。最好不要把初始化的变量和未初始化的变量放在同一条声明中。
声明为变量创建和标记存储空间,并为其指定初始值。
打印int类型的值:%d指明了在一行中打印整数的位置
#include <stdio.h>int main(void)
{int one = 1;int five = 5;printf("One is %d and Five is %d, their subtraction is %d\n", one, 5, five - one);printf("First is %d, %d, %d, %d, %d, %d\n", one); //少了5个参数return 0;
}
运行结果
第一行中,第1个%d对应的是int类型变量one,第2个%d对应的是int类型常量5,第3个%d对应的为int类型表达式five - one的值。
第二行中,第1个%d对应的是int类型变量one,没有给后面的5个%d传值,所以打印出的值是内存中的任意值。
在不同的平台下,缺少参数或参数类型不匹配导致的结果不同。
八进制和十六进制:
0前缀表示八进制,十进制16表示成八进制为020。
0x或0X前缀表示十六进制,十进制16表示成十六进制是0x10或0X10。
打印八进制和十六进制:
以十进制打印数字,使用%d
以八进制打印数字,使用%o
以十六进制打印数字,使用%x
如果要显示各进制的前缀0,0x和0X,分别用%#o,%#x,%#X
#include <stdio.h>/*以十进制、八进制、十六进制打印十进制数100*/
int main(void)
{int x = 100;printf("dec = %d, octal = %o, hex = %x\n", x, x, x);printf("dec = %d, octal = %#o, hex = %#x\n", x, x, x);return 0;
}
运行结果
其他整数类型:
short int 类型(或者简写成 short)占用的存储空间可能比 int 类型少,常用于小数值的场合以节省空间,short 有符号类型。
long int 或 long 占用的存储空间可能比 int 多。试用于较大数值的场合,long 也是有符号类型的。
long long int 或 long long 占用的储存空间可能比 long 多,适用于更大数值的场合,该类型至少占64位,long long 有符号类型。
unsigned int 或 unsigned,unsigned short int 或 unsigned short,unsigned long int 或 unsigned long,unsigned long long int 或 unsigned long long 只用于非负值的场合,这种类型与有符号类型表示的范围不同。16位 unsigned int 允许的取值范围是 0~65535,而不是-32768~32767。
在任何有符号类型前面添加关键字 signed,可强调使用有符号类型的意图。
使用多种整数类型的原因:
C语言规定short占用的存储空间不能多于 int,long 占用的存储空间不能少于 int。
现在最常见的设置是,long long 占64位,long 占32位,int 占16位或32位,short 占16位。
这4种类型代表4种不同的大小,但是实际使用中,有些类型之间通常用重叠。
C标准对基本数据类型规定了允许的最小大小。
对于16位机,short 和 int 的最小取值范围为[-32767,32767]
对于32位机,long 的最小取值范围为[-2147483647,2147483647]
对于 unsigned short 和 unsigned int ,最小取值范围为[0,65535]
对于 unsigned long,最小取值范围为[0,4294967295]
long long 的最小取值范围为[-9223372036854775807,9223372036854775807]
unsigned long long 的最小取值范围为[0,18446744073709551615]
用int类型首先考虑 unsigned 类型,这种类型的数常用于计数,unsigned 也可以表示更大的正数。
如果一个数超出了 int 类型的取值范围,且在 long 类型的取值范围内时,使用 long 类型。
long常量和long long常量:
如果数字超出了int可表示的最大值,编译器就会将其视为long int类型,如果超出了long可表示的最大值,编译器就会将其视为unsigned long类型,如果还不够大,编译器就会将其视为long long或unsigned long long类型。
八进制和十六进制常量被视为int类型,如果值太大,编译器就会使用unsigned int,如果还不够大,编译器会依次使用long,unsigned long,long long和unsigned long long类型。
要把一个较小的数作为long类型对待,可以在值的末尾加上l或L后缀,八进制和十六进制也适用l和L后缀。
在支持long long类型的系统中,也可以使用ll或LL后缀来表示long long类型的值
u或U后缀表示unsigned
整数超出了相应类型的取值范围:
#include <stdio.h>int main(void)
{int i = 2147483647;unsigned int j = 4294967295;printf("%d %d %d\n", i, i+1, i+2);printf("%d %d %d\n", j, j+1, j+2);return 0;
}
运行结果
在超过最大值时,unsigned int类型的变量j从0开始,而int类型的变量i从-2147483648开始
当i超出(溢出)其相应类型所能表达的最大值时,系统并未通知用户,需要自己注意这类问题
打印short、long、long long和unsigned类型:
打印unsigned int类型的值,使用%u转换说明
打印long类型的值,使用%ld转换说明
打印八进制long类型的值,使用%lo转换说明
打印十六进制long类型的值,使用%lx转换说明
虽然C语言允许使用大写或小写的常量后缀,但是在转换说明中只能用小写
对于short类型,使用h前缀
%hd表示打印十进制short类型的整数
%ho表示打印八进制short类型的整数
h和l前缀都可以和u一起使用,用于表示无符号类型
支持long long类型的系统,%lld和%llu分别表示有符号和无符号类型
#include <stdio.h>int main(void)
{unsigned int un = 3000000000;short end = 200;long big = 65537;long long verybig = 12345678908642;printf("un = %u and not %d\n", un, un);printf("end = %hd and %d\n", end, end);printf("big = %ld and not %hd\n", big, big);printf("verybig = %lld and not %ld\n", verybig, verybig);return 0;
}
运行结果
第1行输出,对于无符号变量un,使用%d会产生负值,因为无符号值3000000000和有符号值-1294967296在系统内存中的内部表示完全相同
在待打印的值大于有符号值的最大值时,会发生这种无符号和有符号所打印的值不同的情况
对于较小的正数,有符号和无符号类型的存储、显示都相同
第2行输出,对于short类型的变量end,在printf()中无论指定以short类型(%hd)还是int类型(%d)打印,打印出来的值都相同
这是因为在给函数传递参数的时候,C编译器把short类型的值自动转换成int类型的值
int类型被认为是计算机处理整数类型时最高效的类型
使用h修饰符的用处:使用h修饰符可以显示较大整数被截断成short类型值的情况
第3行输出,把65537以二进制格式写成一个32位是00000000000000010000000000000001,使用%hd,printf()只会查看后16位,所以显示的值是1
第4行输出,使用了%ld,printf()只显示了储存在后32位的值
char类型:
char类型用于储存字符,char也是整数类型,因为char类型实际上储存的是整数而不是字符,整数和字符通过ASCII码互相对应
C语言把字符常量视为int类型而不是char类型
一般来说,C语言会保证char类型足够大,以储存系统(实现C语言的系统)的基本字符集
C语言把1字节定义为char类型占用的位(bit)数
C语言允许在关键字char前面使用signed或unsigned,signed char表示有符号类型,unsigned char表示无符号类型,如果只用char处理字符,char前面不需要使用任何修饰符
有符号char可表示的范围为-128~127,无符号char可表示的范围为0~255
字符常量和初始化:
char grade = 'A';或者char grade = 65;
单引号括起来的是字符,双引号括起来的是字符串
非打印字符:
单引号只适用于字符、数字和标点符号,有些ASCII字符是打印不出来的
C语言中有3种方法打印这些字符:
第1种是用ASCII码
第2种是用特殊的符号序列表示一些特殊的字符,这些字符序列叫做转义序列
转义序列 | 含义 |
\a | 警报 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜杠(\) |
\' | 单引号 |
\" | 双引号 |
\? | 问号 |
\0oo | 八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数) |
\xhh | 十六进制(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数) |
如果要用八进制ASCII码表示一个字符,可以在编码值前面加一个反斜杠(\),并用单引号括起来
十进制、八进制、十六进制都可以表示字符常量
打印字符:
printf()函数用%c指明待打印的字符
一个字符变量被储存为1字节的整数值,所以可以用%d打印char类型的整数值
#include <stdio.h>/*字符ASCII码*/
int main(void)
{char ch = 'B';printf("The code for %c is %d\n", ch, ch);return 0;
}
运行结果
_Bool类型:
_Bool类型用于表示布尔值,true和false
C语言中可以用1表示true,0表示false,所以_Bool类型也是一种整数类型
float、double、和long double:
C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10-37~10+37
通常系统储存一个浮点数要占用32位,其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫作尾数或有效数)及其符号
double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字,实际上double类型的值至少有13位有效数字
long double类型的精度比double类型更高,但C只保证long double类型至少与double类型的精度相同
浮点型常量:
浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后一个是有符号数表示10的指数
可以没有小数点(如,2E5)或指数部分(如,19.28),但是不能同时省略两者
可以省略小数部分(如,3.E16)或整数部分(如,.45E-6),但是不能同时省略两者
不能在浮点型常量中间加空格,如156 E+12
默认情况下,编译器假定浮点型常量是double类型的精度
通常,4.0和2.0被储存为64位的double类型,使用双精度进行乘法运算,然后将乘积截断成float类型的宽度
在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型,如2.3f和9.11E9F
使用l或L后缀使得数字成为long double类型,没有后缀的浮点型常量是double类型
打印浮点值:
printf()函数使用%f转换说明打印十进制记数法的float和double类型浮点数
用%e打印指数记数法的浮点数
如果系统支持用十六进制格式的浮点数,可用a和A分别代替e和E
用%Lf,%Le,%La打印long double类型
浮点值的上溢和下溢:
float toobig = 3.4E38 * 100.0f;
printf("%e\n", toobig);
当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢
在这种情况下会给toobig赋一个表示无穷大的特定值,而且printf()显示该值为int或infinity(或者具有无穷含义的其他内容)
在计算过程中损失了原末尾有效位数上的数字,这种情况叫做下溢
C语言把损失了类型全精度的浮点值称为低于正常的浮点值
因此,把最小的正浮点数除以2将得到一个低于正常的值,如果除以一个非常大的值,会导致所有的位都为0
如果传入的值超出了函数规定的范围,函数将返回NaN值
复数和虚数类型:
C语言的3种复数类型:float _Complex,double _Complex和long double _Complex
C语言的3种虚数类型:float _Imaginary,double _Imaginary和long double _Imaginary
如果包含complex.h头文件,就可以用complex代替_Complex,用imaginary代替_Imaginary
类型大小:
sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小
C99和C11提供%zd转换说明匹配sizeof的返回类型,一些不支持C99和C11的编译器可用%u或%lu代替%zd转换说明匹配sizeof的返回类型
在char类型为16位,double类型为64位的系统中,sizeof给出的double是4字节
运算对象是类型时,圆括号不能少,如,sizeof(char),但是对于特定量,可有可无,如sizeof name,sizeof 6.28
在limits.h和float.h头文件中有类型限制的相关信息
使用数据类型:
把一个类型的数值初始化给不同类型的变量时,编译器会把值转换成与变量匹配的类型,这将导致部分数据丢失
C编译器把浮点数转换成整数时,会直接丢弃(截断)小数部分,而不进行四舍五入
C只保证了float类型前6位的精度
刷新输出:
printf()语句把输出发送到一个叫做缓冲区的中间存储区域,然后缓冲区中的内容再不断被发送到屏幕上
C标准明确规定了何时把缓冲区中的内容发送到屏幕:当缓冲区满、遇到换行字符或需要输入的时候(从缓冲区把数据发送到屏幕或文件被称为刷新缓冲区)
转载于:https://www.cnblogs.com/sch01ar/p/8648017.html
C Primer Plus学习笔记(二)- 数据和C相关推荐
- 学习笔记之数据可视化(二)—— 页面布局(下)
续上一章 2.7 地图区域(.map) 2.7.1 实现步骤: 2.8 用户统计模块 2.8.1 布局: 2.8.2 柱状图 2.9 订单模块 2.9.1 订单区域布局 2.9.2 订单区域(orde ...
- 学习笔记之数据可视化(二)——页面布局(中)
续上一章 2.6 监控区域布局 2.6.1 布局结构解析: 2.6.2 样式描述: 2.6.3 HTML结构及CSS样式代码 2.6.3 ### 监控区域-效果 2.6.7 点位区域(point) 2 ...
- 学习笔记之数据可视化(二)——页面布局(上)
~续上一章 2. 项目页面布局 2.1 基础布局 2.1.1 PC端屏幕宽度适配设置 2.1.2 主体容器viewport背景图片 2.1.3 HTML结构 2.1.4 css样式代码 2.2 边框图 ...
- Colly 学习笔记(二)——爬虫框架,抓取下载数据(上证A股数据下载)
Colly 学习笔记(二)--爬虫框架,抓取下载数据(上证A股数据下载) Colly 学习笔记(一)--爬虫框架,抓取中金公司行业市盈率数据 Colly 学习笔记(二)--爬虫框架,抓取下载数据(上证 ...
- Mysql学习笔记(二)——表格及数据的插入
Mysql学习笔记(二)--表格及数据的插入 文章目录 Mysql学习笔记(二)--表格及数据的插入 1.Mysql常用指令 2.创建表格 A.数据类型 B.完整性约束条件 3.查看表格 4.修改表格 ...
- Spring Boot 框架学习笔记(二)(配置文件与数据注入 yaml基本语法 JSR303数据验证 多环境切换 )
Spring Boot 框架学习笔记(二) 六.appliaction.properties配置与数据注入 6.1 `@Value`注解 测试注入数据 读取输入流 6.2 读取配置文件数据注入 单文件 ...
- 整理:C primer plus 学习笔记
前言:简单看了一遍C Primer Plus, 整理了一下,因为时间比较少,自己理解地比较肤浅,所以第一版比较简陋. 假期的时候应该会有时间再整理一下.------2018/11/5 2019/1/2 ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
- tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数
tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报 分类: tensorflow(4) 目录(?)[+] 本笔记目的 ...
最新文章
- pycharm打包.py程序为可执行文件exe
- 团队成员的分应该怎么分?
- table中td内容过长自动换行
- python用模块读取xml文件_Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)...
- python函数手册 chm_Python中文文档
- 论文降重的技巧(一顿操作猛如虎-一看查重35%)
- 【回归分析】logistic regresssion中的拟合优度检验(goodness-of-fit test)
- 如何快速去除PDF的密码和限制:遇到PDF被加密,不能复制、编辑,怎么办?教大家一个又快又好用的方法、实用。
- 淘宝优惠券去哪里领?
- 公关广告策略分析:如何结合广告的推力和公关的拉力
- Harbor中镜像清理
- PPPoE协议应用场景
- 苹果开发者公司账号的申请步骤
- Matlab拟合工具箱的使用
- python里怎么使用snip_MacOS下好用的截图软件snip
- Meanshift 和 Camshift
- arcgis android 指南针,BaiduMap SDK-地图显示指南针(左上角)
- Cytoscape安装及使用
- 俄国防部组建信息作战部队 应对西方网络-心理攻击
- 药一点医药软件供应商——医疗器械管理系统