
C语言数据类型和变量目录1 数据类型的介绍1.1 字符型1.2 整型1.3 浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 一个字节是8个bit位2 signed 和 unsigned2.1 size_t 类型3 数据类型的取值范围4 变量4.1 变量的创建4.2 变量的分类5 算术操作符5.1 和 -5.2 * 乘法运算5.3 / 除法运算5.4 % 取模(余)6 赋值操作符6.1 连续赋值6.2 复合赋值7 单目操作符7.1 和 --7.2 和 - (正负号)8 强制类型转换9 scanf 和 printf9.1 printf 用法9.1.1 基本用法9.1.2 占位符9.1.3 占位符列举9.1.4 输出格式9.1.4.1 限定宽度9.1.4.2 总是显示正负号9.1.4.3 限定小数位数9.1.4.4 输出部分字符9.2 scanf 输入9.2.1 基本用法9.2.2 scanf的返回值与原理9.2.3 占位符与赋值忽略符1 数据类型的介绍用整数类型来描述整数字符数类型描述字符浮点数类型描述小数。数据类型就是int char等。类型就是相似的数据所具有的共同特征。编译器只有知道了数据的类型才知道怎么操作数据。数据类型分为内置类型和自定义类型。内置类型又分为字符型整型浮点型布尔类型。1.1 字符型关键字 char (character)描述用于描述字符。1.2 整型关键字 int (integer)描述用于描述整数如 1, 2, 3, 4。细分短整型 short int short长整型 long int long长长整型 long long int long long1.3 浮点型描述- 关键字 int (integer)描述用于描述整数如 1, 2, 3, 4。细分短整型 short int short长整型 long int long长长整型 long long int long long小数 浮点数它的类型叫浮点型。细分单精度浮点型 float双精度浮点型 double精度更长的浮点型 long double1.4 布尔类型关键字 _Bool描述有些值只有真/假两种类型这些值叫布尔值。规则0表示假非0则为真。头文件需包含 stdbool.h 。示例代码c#include stdbool.hint main() {_Bool n true; // n赋值为true或falseif(n)printf(“真”);return 0;}(注早期C语言可能使用宏定义 #define bool _Bool )1.5 各种数据类型的长度每一种数据类型都有自己的长度。1.5.1 sizeof 操作符定义 sizeof 是一个关键字也是一个操作符专门用来计算 sizeof 的操作数类型的长度。单位字节。用法 sizeof 用 %zd 输出。示例cprintf(“%zd\n”, sizeof(char)); // 输出 1 (1个字节)printf(“%zd\n”, sizeof(int)); // 输出 4 (4个字节)标准规定 sizeof(long) sizeof(int) 。1.5.2 一个字节是8个bit位bit位计算机识别的二进制 0/1称为 1 bit 位。换算- 1 字节 (char) 8 bit- 1 字节 (_Bool) 8 bit- 注意 sizeof(a) 当 a 为变量时等同于 sizeof a 可以省略括号。2 signed 和 unsignedsigned (有符号的)可正、可负、可0。例如 signed int num。默认就是 signed。unsigned (无符号的)仅正或0。例如 unsigned int num。- 作用声明 unsigned 的好处是同样长度的内存能够表达的最大整数值增加了一倍。- signed short int (16位): -32768 ~ 32767- unsigned short int: 0 ~ 65535 (最大值扩大一倍)- char 的特殊性char 是否有正负号由当前系统决定可能是 signed char 也可能是 unsigned char。2.1 size_t 类型定义sizeof 的计算结果为 size_t 类型。打印格式- %zd (有符号整数C99标准引入)- %u (打印无符号整数对应 unsigned int)- %lu (对应 unsigned long)- %llu (对应 unsigned long long)- 目的C语言统一了一下创造了 size_t用来统一表示 sizeof 的返回值类型。3 数据类型的取值范围问题为什么有那么多数据类型因为每一个数据类型的取值范围不同 (min, max)。查询工具- limits.h 文件说明了整型类型的取值范围。- float.h 文件说明了浮点型类型的取值范围。4 变量类型就是用来创建变量例如有一个类型int用int来创建一个变量。4.1 变量的创建概念C语言中把经常变化的量年龄身高称为变量不变的量身份证号血型称为常量。语法数据类型 变量名;cint age; // 变量名字叫age它的类型是intdouble weight;初始化创建变量的同时给它一个初始值。cint age 20;char ch ‘q’;float weight 50.5f; // 如果写50.5编译器会认为是double加f表示float4.2 变量的分类全局变量在大括号外部定义的变量。使用范围更广整个工程可用。局部变量在大括号内部定义的变量。使用范围比较局限只在所在范围使用。- 作用域冲突如果局部变量与全局变量名字相同局部变量优先。- 内存存储- 栈区存放局部变量、函数参数。- 堆区动态内存管理。- 静态区存放全局变量、静态变量。5 算术操作符加减- 乘*除 / 取余% 均为双目操作符。操作符也叫运算符。5.1 和 -双目操作符有两个操作数左操作数右操作数。cint a 3 5;3为左操作数5为右操作数。5.2 * 乘法运算双目运算符。cprintf(“%d”, num * 5);5.3 / 除法运算整数除法除号两端都是整数则计算结果也为整数截断小数部分。cprintf(“%d\n”, 8 / 2); // 4printf(“%d\n”, 6 / 4); // 1 (不是1.5)浮点数除法除号两端至少有一个是浮点数则计算的是小数除法。cprintf(“%f\n”, 6.0 / 4); // 1.5000005.4 % 取模(余)定义求得整除之后的余数。cprintf(“%d\n”, 10 % 3); // 1限制只可作用于整数不可作用于浮点数。符号规则负数求模余数的符号取决于第一个整数的符号。11 % -5 - 1-11 % 5 - -1-11 % -5 - -16 赋值操作符 赋值操作符。6.1 连续赋值cint a 3;int b 5;int c 0;c b a 3; // 不推荐这种写法建议分开写规则从右向左依次赋值。6.2 复合赋值a a 5; 可以简写为 a 5; (先加后赋)。其他复合赋值符 * , / , % , , - 。7 单目操作符单目操作符–-只有一个操作数。7.1 和 –功能自增1 / 自减1。前置 (a)先加1后使用。cint a 5;int b a; // a变为6b也等于6后置 (a)先使用后加1。cint a 5;int b a; // b先拿到5然后a才变为67.2 和 - (正负号)正号 ()对正负号没有影响可省略。 int a 10; 等同于 int a 10; 。负号 (-)用来改变一个值的正负号。8 强制类型转换语法 (类型)示例cint a (int)3.14; // 强制转换为intprintf(“%d\n”, a); //如果没有int 输出 3报警告。加上int之后a3无警告。注意无int 会有警告只保留整数部分。9 scanf 和 printf9.1 printf 用法printf print format (格式)。将数据按指定格式打印。需要头文件 stdio.h 。9.1.1 基本用法cprintf(“Hello, world!\n”);9.1.2 占位符可以在输出文本中指定占位符用后面的参数替换。%d 十进制整数%f 浮点数%c 字符%s 字符串9.1.3 占位符列举%c : char%d : int (十进制)%f : float / double (默认保留6位小数)%lf : double (在scanf中必须用%lfprintf中%f即可)%hd : short int%hu : unsigned short int%ld : long int%lld : long long int%p : 指针(用来打印地址)%u : unsigned int%x : 十六进制整数%zd : size_t二进制由0和1组成8进制由0到7组成16进制由0到9abcdef组成10进制由0~9组成9.1.4 输出格式printf() 可以定制占位符的输出格式。9.1.4.1 限定宽度Printf允许限定占位符的最小宽度最小宽度的限制。%5d : 最小宽度为5位。如果不够5位左边补空格右对齐。%-5d : 左对齐。%05d : 不够的地方用0填充如 00123。%5d等价于%空格5d不够的地方用空格填充对于小数限字符会限制所有数字的最小显示宽度。9.1.4.2 总是显示正负号%d : 打印正数时显示 号打印负数时显示 - 号。9.1.4.3 限定小数位数%.2f : 小数点后保留两位四舍五入。%8.2f : 总宽度至少8位小数点后2位。9.1.4.4 输出部分字符占位符%s默认打印所有字符%.ns : 对于字符串只打印前 n 位。cprintf(“%.3s\n”, “abcdef”); // 输出 abc9.2 scanf 输入Scanf是可以给变量输入值scanf() 函数用于读取用户的键盘输入。程序运行到这里会停下来等待用户输入。scanf 需要取地址操作符9.2.1 基本用法语法 scanf(“格式字符串”, 变量地址);注意变量前面必须加 (取地址操作符)除了数组名本身代表地址外。安全性scanf 是不安全的可能导致缓冲区溢出。VS编译器建议使用 scanf_s但 scanf_s 是微软特有的不具备跨平台性。解决方法在代码第一行加上 #define _CRT_SECURE_NO_WARNINGS 。9.2.2 scanf的返回值与原理原理用户输入放入缓冲区scanf 依照占位符对缓存进行解读。返回值返回成功读取的变量个数。如果读取失败或遇到文件结束返回 EOF (-1)。应用常用于 OJ (Online Judge) 题目中的循环输入。cwhile(scanf(“%d %d”, a, b) ! EOF) { … }9.2.3 占位符与赋值忽略符scanf所用占位符与printf 基本一致scanf在读到后面的空格时会停止。空格处理 %d , %f 等会自动跳过前面的空白字符空格、换行、制表符。但 %c 会读取空格。对%c空格字符也是字符输入的时候也要加上空格-%sscanf 后面是%s的时候意味着要读一个字符串字符串要放在数组里面即字符数组赋值忽略符 * 在 % 和格式符之间加 *表示读取该数据但不赋值给变量跳过该数据。cint year, month, day;// 读取时跳过中间的横杠 ‘-’scanf(“%d%*c%d%*c%d”, year, month, day);