数据类型介绍
- 字符
char//所占空间内存大小为1B
signed char
unsigned char
- 整型
//短整型
short [int]//所占空间内存大小为2B
[signed] short [int]
unsigned short [int]
//整型
int//所占空间内存大小为4B
[signed] int
unsigned int
//⻓整型
long [int]//所占空间内存大小为4B
[signed] long [int]
unsigned long [int]
//更长的整型
long long [int]//所占空间内存大小为8B
[signed] long long [int]
unsigned long long [int]
- 浮点型
float//所占空间内存大小为4B
double//所占空间内存大小为8B
long double//所占空间内存大小为8B
- 布尔类型
_Bool的取值为true or false
使用_Bool需要引用头文件#include<stdbool.h>
进制的转换:
8b=1B
1024B=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
1024TB=1PB
signed 和 unsigned
C 语言使用 signed 和 unsigned 关键字修饰字符型和整型类型的。
- signed 关键字,表示⼀个类型带有正负号,包含负值;
- unsigned 关键字,表示该类型不带有正负号,只能表示零和正整数。
unsigned的优点:同样的长度能够表示最大的整数值增加了一倍。
size_t unsigned int
中size_t是专门为sizeof设置的类型,打印时的格式为%zd。
存储类型范围:
signed char : -128~127
unsigned char : 0~255
short : -32768~32767
unsigned short : 0~65535
int : -2147483648~2147483647
unsigned int : 0~4294967295
变量
C语言中把经常变化的值称为变量,不变的值称为常量。
变量的命名
- 只能由字母(包括大写和小写)、数字和下划线(_)组成
- 不能以数字开头
- 长度不能超过63个字符
- 变量名中区分大小写的
- 变量名不能使用关键字
变量的分类
- 全局变量:在大括号外部定义的变量就是全局变量
全局变量的使用范围更⼴,整个工程中想使用,都是有办法使用的。
- 局部变量:在大括号内部定义的变量就是局部变量
局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。
注意:当局部变量和全局变量同名的时候,局部变量优先使用。
如何进行存储
- 栈区——局部变量,函数参数
- 堆区——动态内存管理(malloc,calloc,realloc,free)
- 静态区——全局变量,静态变量
算数操作符
- +
- -
- *
- /
( - m ) / n 和 m / ( - n ) 等价于 - ( m / n )
若想结果为浮点数,两个数中至少有一个浮点数。 - %
负数取模规则:结果的正负号由第一个运算数的正负号决定。例如:m%(-n)=m%n , (-m)%n=- (m%n)
赋值操作符
- =
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
连续赋值
例如:c=b=a+5
C语⾔虽然⽀持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样方便观察代码的执行细节。
复合赋值符
- +=
- -=
- *=
- /=
- %=
- <<=
- >>=
- &=
- |=
- ^=
单目操作符
- ++
前置++:先++,再使用
后置++:先使用,再++ - - -
前置–:先–,再使用
后置–:先使用,再– - !逻辑反操作
- -
- +
- & 取地址
- sizeof 操作数的类型长度
- ~ 对一个二进制数按位取反
- * 解引用
- (类型) 强制类型转换
scanf 和 printf
printf
占位符
常见的占位符:
%c 打印一个字符 %p 打印地址
%d 打印数字 %s 打印字符串
%f 打印单精度浮点数 %u 打印无符号十进制整数
%lf 打印双精度浮点数 %o 打印八进制整数
%x 打印十六进制整数
限定宽度
允许限定占位符的最小宽度。
例如:
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
%5d 表⽰这个占位符的宽度至少为5位。如果不满5位,对应的值的前⾯会添加空格。输出的值默认是右对⻬,即输出内容前面会有空格;如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。
显示正负号
默认情况下, printf() 不对正数显⽰ + 号,只对负数显示 - 号。如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 +。
限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后⾯只保留两位,占位符可以写成%.2f。
输出部分字符串
%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出的长度,其中 [m] 代表⼀个数字,表示所要输出的长度。
scanf
注意:
- 变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址。
- 如果这里的变量是指针变量(比如字符串变量),那就不用加 & 运算符。
- scanf() 处理数值占位符时,会⾃动过滤空白字符,包括空格、制表符、换行符等。
scanf返回值
scanf() 的返回值是⼀个整数,表示成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到文件结尾,则返回常量 EOF。
多组输入
利用scanf返回值的特点,做到多次输入。例如:
#include<stdio.h>
int main()
{
int a=0;
while((scanf("%d",&a)) !=EOF )
{
if(a>=140)
{
printf("Genius\n");
}
}
return 0;
}
占位符
注意:
- 除了 %c 以外,其它占位符都会自动忽略起首的空白字符。如果要强制跳过字符前的空白字符,可以写成
scanf(" %c", &ch)
。 - %s 其实不能简单地等同于字符串。它的规则是,从当前第⼀个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。因此⽆法用来读取多个单词。
赋值忽略符
例如:
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
return 0;
}
如果用户输⼊ 2020-01-01 ,就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他格式,⽐如 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。
因此需要改成这样:
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
return 0;
}
%*c 就是在占位符的百分号后⾯,加入了赋值忽略符 \ * ,表示这个占位符没有对应的变量,解读后不必返回。