C语言数据类型和变量
目录
- 1 数据类型的介绍
- 1.1 字符型
- 1.2 整型
- 1.3 浮点型
- 1.4 布尔类型
- 1.5 各种数据类型的长度
- 1.5.1 sizeof 操作符
- 1.5.2 一个字节是8个bit位
- 2 signed 和 unsigned
- 2.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 和 printf
- 9.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 long
1.3 浮点型
- 描述- 关键字: int (integer)
- 描述:用于描述整数(如 1, 2, 3, 4)。
- 细分:
- 短整型: short int == short
- 长整型: long int == long
- 长长整型: long long int == long long
:小数 == 浮点数,它的类型叫浮点型。 - 细分:
- 单精度浮点型: float
- 双精度浮点型: double
- 精度更长的浮点型: long double
1.4 布尔类型
- 关键字: _Bool
- 描述:有些值只有真/假两种类型,这些值叫布尔值。
- 规则:0表示假,非0则为真。
- 头文件:需包含 <stdbool.h> 。
- 示例代码:
c
#include <stdbool.h>
int main() {
_Bool n = true; // n赋值为true或false
if(n)
printf(“真”);
return 0;
}
(注:早期C语言可能使用宏定义 #define bool _Bool )
1.5 各种数据类型的长度
每一种数据类型都有自己的长度。
1.5.1 sizeof 操作符
- 定义: sizeof 是一个关键字,也是一个操作符,专门用来计算 sizeof 的操作数类型的长度。
- 单位:字节。
- 用法: sizeof 用 %zd 输出。
- 示例:
c
printf(“%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 和 unsigned
- signed (有符号的):可正、可负、可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语言中把经常变化的量(年龄,身高)称为变量,不变的量(身份证号,血型)称为常量。
- 语法:数据类型 变量名;
c
int age; // 变量名字叫age,它的类型是int
double weight;
- 初始化:创建变量的同时给它一个初始值。
c
int age = 20;
char ch = ‘q’;
float weight = 50.5f; // 如果写50.5,编译器会认为是double,加f表示float
4.2 变量的分类
- 全局变量:在大括号外部定义的变量。使用范围更广(整个工程可用)。
- 局部变量:在大括号内部定义的变量。使用范围比较局限(只在所在范围使用)。- 作用域冲突:如果局部变量与全局变量名字相同,局部变量优先。- 内存存储:- 栈区:存放局部变量、函数参数。- 堆区:动态内存管理。- 静态区:存放全局变量、静态变量。
5 算术操作符
加(+),减(- ),乘(*),除( / ),取余(% ), 均为双目操作符。
操作符也叫运算符。
5.1 + 和 -
- 双目操作符:有两个操作数(左操作数,右操作数)。
c
int a = 3 + 5;3为左操作数,5为右操作数。
5.2 * 乘法运算
- 双目运算符。
c
printf(“%d”, num * 5);
5.3 / 除法运算
- 整数除法:除号两端都是整数,则计算结果也为整数(截断小数部分)。
c
printf(“%d\n”, 8 / 2); // 4
printf(“%d\n”, 6 / 4); // 1 (不是1.5)
- 浮点数除法:除号两端至少有一个是浮点数,则计算的是小数除法。
c
printf(“%f\n”, 6.0 / 4); // 1.500000
5.4 % 取模(余)
- 定义:求得整除之后的余数。
c
printf(“%d\n”, 10 % 3); // 1
- 限制:只可作用于整数,不可作用于浮点数。
- 符号规则:负数求模,余数的符号取决于第一个整数的符号。
- 11 % -5 -> 1
- -11 % 5 -> -1
- -11 % -5 -> -1
6 赋值操作符
= 赋值操作符。
6.1 连续赋值
c
int 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,后使用。
c
int a = 5;
int b = ++a; // a变为6,b也等于6
- 后置 (a++):先使用,后加1。
c
int a = 5;
int b = a++; // b先拿到5,然后a才变为6
7.2 + 和 - (正负号)
- 正号 (+):对正负号没有影响,可省略。 int a = +10; 等同于 int a = 10; 。
- 负号 (-):用来改变一个值的正负号。
8 强制类型转换
- 语法: (类型)
- 示例:
c
int a = (int)3.14; // 强制转换为int
printf(“%d\n”, a); //如果没有int, 输出 3,报警告。加上int之后,a=3无警告。
- 注意:无int 会有警告,只保留整数部分。
9 scanf 和 printf
9.1 printf 用法
printf = print + format (格式)。将数据按指定格式打印。需要头文件 <stdio.h> 。
9.1.1 基本用法
c
printf(“Hello, world!\n”);
9.1.2 占位符
可以在输出文本中指定占位符,用后面的参数替换。
- %d :十进制整数
- %f :浮点数
- %c :字符
- %s :字符串
9.1.3 占位符列举
- %c : char
- %d : int (十进制)
- %f : float / double (默认保留6位小数)
- %lf : double (在scanf中必须用%lf,printf中%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到9,abcdef组成
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 位。
c
printf(“%.3s\n”, “abcdef”); // 输出 abc
9.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) 题目中的循环输入。
c
while(scanf(“%d %d”, &a, &b) != EOF) { … }
9.2.3 占位符与赋值忽略符
scanf所用占位符与printf 基本一致,scanf在读到后面的空格时会停止。
- 空格处理: %d , %f 等会自动跳过前面的空白字符(空格、换行、制表符)。但 %c 会读取空格。对%c,空格字符也是字符,输入的时候也要加上空格
-%s:scanf 后面是%s的时候意味着要读一个字符串,字符串要放在数组里面即字符数组 - 赋值忽略符 * :
- 在 % 和格式符之间加 *,表示读取该数据但不赋值给变量(跳过该数据)。
c
int year, month, day;
// 读取时跳过中间的横杠 ‘-’
scanf(“%d%*c%d%*c%d”, &year, &month, &day);