C语言数据类型和变量
目录
1.数据类型介绍
C语言提供了丰富的 数据类型 来描述生活中的各种数据
(编程 --> 写代码 -->解决生活中的实际问题)
(在实际生活中有各种数据,如买一件,需要有名字、价格、编码等。而C中的数据类型就是描述这些数据的。)
比如 整数类型就是描述整数,浮点型就是描述小数,字符类型就是描述字符…
1.字符型:
1 char//character
2 [signed] char//有符号的
3 unsigned char//无符号的
2.整形
注意以下【】可以省略
1.//短整型
2.short [int]
3.[signed] short [int]
4.unsigned short [int]
5.//整形
6.int
7.[signed] int
8.unsigned int
9.//长整型
10.long [int]
11.[signed] long [int]
12.unsigned long [int]
13.//更长整形
14.long long [int]
15.[signed] long long [int]
16.unsigned long long [int]
3.浮点型
1.float//单精度浮点型
2.double//双精度浮点型
4.布尔类型
C语言中原来并 没有 为布尔值单独设置一个类型,而是使用整数 0 表示假,非 0 表示真。
在C99引入了布尔类型,专门表示真假的。
1. bool
bool的用法
5.各种数据类型的长度
每一种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的类型,变量长度不同,存储的数据范围也就不同。
sizeof是专门计算类型长度的,其单位是 Byte(字节)
注意:sizeof后面的表达式是不真实参加运算的,其是根据表达式的类型进行计算的。
2.signed和unsigned
C语言使用 signed 和 unsigned 关键字修饰 字符型和整形类型 的。、
signed关键字(可省略),表示一个类型带有正负号;
unsigned关键字,只能表示零和正整数(不带有正负号)。
注意:对于 int类型 ,默认带有正负号(int 就等同于 signed int)
signed int a;//等同于int a
当然,int类型 也可以不带正负号,只表示非负整数。这时 就必须使用unsigned声明。
unsigned int a;
注意:整数变量声明为 unsigned 的好处是,同样长度的内存能够表达的最大整数值,增大了一倍。 例如,signed short int 的取值范围是 -32768 - 32767,最大值是32767;而 unsigned short int 的取值范围是 0 - 65535,最大值增到了65535。
注意:C语言规定char类型默认是否带有正负号,有系统决定。(char 可能是signed char 也可能是unsigned char, 这一点与int用法不同。)
3.数据类型的取值范围
及以上学习,不难发现整形类型就有4种: short, int, long, long long。
其实每一种数据类型都有属于自己的存储范围。类型越长的,存储范围越大。要根据实际情况,合理的运用数据类型。
若想查看数据类型的极限值,可以从limits.h 文件(整形类型的取值范围),float.h(浮点类型的取值范围) 查看。
4.变量
C语言中经常把变化的量叫做变量。
变量在创建的时候就给一个初始值,这就是初始化(初始化可以是任何值)。
int a = 12;
float s= 0;
...
注意:
1.变量名尽量有意义。
2.变量名的组成只能是字母,数字,下划线,并且不能是数字开头。
3.变量名不能是关键字。
而变量又分为全局变量和局部变量。(全局变量:大括号外定义的变量,其作用极广。局部变量:大括号内定义的变量。注意:当全局变量与局部变量的名字相重时,以局部变量优先。 )
5.算数操作符:+ - * / %
进行计算的操作符,这些又称为双目操作符。
6.赋值操作符:= 和复合赋值
7.单目操作符:++ – + -
1.++和–
++是一种自增操作符,又分为前置++和后置++。同理,-- 是一种自减操作符,也分为前置-- 和后置-- 。
例一:
不管前置++,还是后置++,都是将此数向上加1
我认为最重要的是,要将赋值的顺序搞明白。
这个顺序弄明白,接下来的,前置-- 和后置-- 就好办了。
例二:
如果你认为以上理解了,那么我给你看个 有意思的东西。
例一:
例二:
不要认为我打错了,那只是你认为的。(头一开始我也懵逼了)
但我相信,你若看明白,那么会对printf函数 有进一步了解。
(再给个提醒,动手试试看)
2.+ 和 -
运算符+ 对 打印 出的正负值没有影响,是一个完全可以省略的运算符。话说回来,写了也不会报错(就跟现实生活中数学的+、- 使用是一样的)。而运算符- 可以改变一个数的正负。
8.强制类型转换
注意:尽量不要使用强制类型转换,会造成数据丢失。
但我目前使用的vs2022,不用写(),编译器自己就可以进行强制类型转换,并给出警告。
9.scanf和printf介绍
1.printf
printf — 按照指定的格式打印文件
print — 打印
f — format — 格式
注意:在使用printf函数之前,一定要加上#include<stdio.h>。反之,会出现警告(无法解析外部符号)。 我们要合理的运用警告提醒,这一点是很重要的。
stdio.h
standard — 标准
i — input — 输入
o — output — 输出
printf( )不会在行尾自动添加换行符。运行结束后,光标就会停留在输出结束的地方,不会自动换行。
若想将光标移到下一行,必须用到转义字符 “\n”(其作用相当于回车键)。 “\n”用法极其广泛。
2.占位符
所谓“占位符”,就是 这个位置 可以用 其他值 带入。
注意:占位符可以多个共存 且 printf( )内的参数必须与占位符 一 一 对应(要用准确)。
常见占位符:
%c — 字符
%d — 十进制整数
%f — float类型
%lf — double类型
%hd — 十进制short int类型
%hu — unsigned short int类型
%ld — 十进制long int类型
%lu — unsigned long int类型
%Lf — long double类型浮点数
%p — 指针(用来打印地址)
%s — 字符串
%u — unsigned int无符号整数
%x — 十六进制整数
%zd — size_t类型
3.printf( )输出格式
3.1限定宽度占位符
3.2打印+、-
总结:在默认情况下printf( )不对正数显示+号,只对负数显示-号。若想输出+号,可在占位符间加上+号。
3.3限定小数位数
3.4限定宽度占位符 和 限定小数位数 结合
我编到这里,不禁感叹,printf函数太牛逼了。这里有许多知识是我以前从未注意到的。这也证实了“学好计算机就要动手操作”
注意:以下是对字符串进行的宽度
4.scanf
4.1 scanf使用原理
变量值输入,就用scanf。变量值输出屏幕,就用printf。(此二者浑然天成)
其scanf( )处理用户输入的原理是:用户输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留下的第一个字符开始,直到读完缓存,或遇到第一个不符合条件的字符为止。
注意:除了%c。余下的占位符,scanf( )在处理占位符时,会自动过滤空格,换行,制表符。而%c要带这 空格 计算,因为 空格 也算字符
若在%c前加上空格,输出时,就会跳过零个或多个空格(最开始的空格)。
在说一下%s,是从当前非空白字符开始开始读起,遇到空白字符为止。另外。scanf( )遇到%s占位符,会在字符串变量末尾存储一个空字符“/0”
注意:存储字符串时,很可能会超过数组边界,导致预料之外的结果。为了防止这种情况,在使用%s占位符时,应该指定读入字符串的最长长度。
4.2 scanf返回值
scanf( )的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或匹配失败,则返回0
如果在成功读取任何数之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)(end of file 文件结束标志 )
4.3 scanf( )的赋值忽略符
赋值忽略符:只要把 *号 任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。