文章目录
1.数据类型的介绍
1.1 数据类型分类
C语言的数据类型多种多样,类型不仅是我们了解数据的开始,也是数据初始化、函数自定义等的操作,编译器只有知道了数据的类型,才能进行相应的操作
字符型:char、[signed] char(有符号字符)、[unsigned] char(无符号字符)
整型:int、[signed] int、unsigned int
短整型:short [int]、[signed] short [int]、unsigned int [int]
长整型:long [int]、[signed] long [int]、unsigned long [int]
更长的整型:long long [int]、[signed] long long [int]、unsigned long long [int]
浮点型:float、double、long double
布尔类型:布尔类型本不是专门的类型,后来为了表示真假,引入了布尔类型_Bool或bool,使用布尔类型必须包含头文件#include <stdbool.h>,布尔类型返回的是true或false,表示真假
注意每种类型的数据都有自己的长度,存储的数据范围有所差异,这里就不过多赘述(详情可看https://legacy.cplusplus.com/)
1.2 sizeof操作符
sizeof是一个关键字,也是个操作符,用于计算操作符数的类型长度,单位是字节
sizeof有两种计算方式:sizeof(类型)、sizeof 表达式
这里要注意的是sizeof后边的表达式是不参与真实运算的,例如:
#include <stdio.h>
int main()
{
int num = 10;
int result = sizeof(num + 20);
// 这里 num + 20 并不会真正进行加法运算,只是根据 num 的类zd型(int)来确定大小。
printf("Size of num + 20: %zd\n", result);
return 0;
}
显而易见这里输出的result的值应为4,在VS2022的X64环境下,常见的int为4个字节,char为1个字节,这里只是根据其类型得出是4个字节。而且sizeof需要用%zd(无符号整型)来打印,sizeof的计算结果是size_t类型的。
sizeof 运算符的返回值,C 语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定, sizeof 到底返回什么类型。不同的系统中,返回值的类型有可能是unsigned int ,也有可能是 unsigned long ,甚至是 unsigned long long ,对应的 printf() 占位符分别是 %u 、 %lu 和 %llu 。这样不利于程序的可移植性。C 语言提供了⼀个解决方法,创造了⼀个类型别名 size_t ,用来统⼀表示 sizeof 的返回值类型。对应当前系统的 sizeof 的返回值类型,可能是 unsigned int ,也可能是unsigned long long
1.3 signed和unsigned
signed表示一个类型带有正负号,unsigned表示一个类型不带有正负号,也就是正整数,所以对于int来说完整的写法应该是signed int,只不过平常忽略不写,但写了也不算错
int 类型也可以不带正负号,只表示非负整数,这时就必须使用关键字unsigned声明变量。unsigned int里面的int可以省略,也就是可以写成unsigned,字符char也存在signed、unsigned
值得注意的是C语言规定char是否默认带有正负号由当前系统决定,这就是说,char 不等同于 signed char ,它有可能是 signed char ,也有可能是unsigned char
2.变量的介绍
2.1 创建与初始化
我们都知道变化的量叫变量,不变的称为常量,创建形式为data_type name,第一个为数据类型,第二个为变量名,例如int a = 10,在变量在创建的时候就给⼀个初始值,这就叫初始化
2.2 分类
全局变量:在大括号外部定义的变量就是全局变量
全局变量的使用范围更广,整个工程中想使用,都是有办法使用的
局部变量:在大括号内部定义的变量就是局部变量
局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的
注意当局部变量和全局变量同名时,局部变量优先使用
2.3 存储
内存中有三个区域:栈区、堆区、静态区
- 局部变量是放在内存的栈区
- 全局变量是放在内存的静态区
- 堆区是用来动态内存管理的(后期会介绍)
3.操作符的介绍
3.1 算术操作符:+、-、*、/、%
C语⾔中为了方便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。
分别是: + - * / % ,这些操作符需要两个操作数进行计算的都是双目操作符,操作符也叫做运算符
用+ 和 - 来完成加法和减法
运算符 * 用来完成乘法
运算符 / 用来完成除法,除号的两端如果是整数,执行的是整数除法,得到的结果也是整数,如果运算数中至少有一个float浮点数,就能得到浮点数
运算符 % 表示求模(余)运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数,负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定
3.2 赋值操作符:=和复合赋值
赋值操作符 = 是⼀个随时可以给变量赋值的操作符,要赋的值放在右边。赋值也可以连续赋值,从右向左依次赋值
对一个数进行自增、自减操作
int a = 10;
a = a+3;
a = a-2;
用复合赋值的方法:
int a = 10;
a += 3;
a -= 2;
代码会显得更方便简洁,对以上的算术操作符都适用
3.3 单目操作符:++、–、+、-
C语言中还有⼀些操作符只有⼀个操作数,被称
为单目操作符。 ++、–、+(正)、-(负) 就是单目操作符
前置++
int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
计算口诀:先+1,后使用
a原来是10,先+1,后a变成了11,再使用就是赋值给b,b得到的也是11,所以计算后,a和b都是11
后置++
int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
计算口诀:先使用,后+1
a原来是10,先使用,就是先赋值给b,b得到了10,然后再+1,然后a变成了11,所以直接计算后a是11,b是10
前置–和后置++与上面同理
4.强制类型转换
以一段代码做例子就明白了
int a = 3.14;
//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告
消除这个警告,就可以使用强制类型转换
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分入代码片
注意强制转化只在万不得已的时候使用
5.占位符的介绍及使用
占位符在printf中这样使用:
#include <stdio.h>
int main()
{
printf("There are %d apples\n", 3);
return 0;
}
这里输出There are 3 apples,这样输出语句更能提高程序的稳定性和准确性
除此之外,还有很多常见的占位符
• %c :字符。
• %d :十进制整数
• %f :小数(包含 float 类型和 double 类型)
• %p :指针(用来打印地址)
• %s :字符串。
• %u :无符号整数
• %x :十六进制整数
• %zd : size_t 类型
限定宽度
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
%5d 表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格
如果希望改成左对齐,在输出内容后面添加空格,可以在占位符的 % 的后面插入⼀个 - 号
总是显示正负号
默认情况下, printf() 不对正数显示 + 号,只对负数显示 - 号。如果想让正数也输出 + 号,可
以在占位符的 % 后面加⼀个 +
限定小数位数
// 输出 Number is 0.50
#include <stdio.h>
int main()
{
printf("Number is %.2f\n", 0.5);
return 0;
}
如果希望小数点后面输出3位( 0.500 ),占位符就要写成 %.3f
也可以和限定宽度结合使用,比如%6.2f,输出为"**0.50"(这里的*表示空格)
最小宽度和小数位数这两个限定值,都可以用 *代替,通过 printf() 的参数传入
输出部分字符串
可以用 %.[m]s 指定输出的长度,其中 [m] 代表⼀个数字,表示所要输出的长度
// 输出 hello
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
这里输出前五个字符,即“hello”
6.scanf函数的介绍
scanf() 函数用于读取用户的键盘输入
程序运行到这个语句时,会停下来,等待用户从键盘输入,输入数据、按下回车键后, scanf() 就会处理用户的输入,将其存入变量
scanf的使用方法与printf类似
scanf("%d%d%f%f", &i, &j, &x, &y);
不过scanf需要加取地址符号&(后面会讲)
注意scanf() 的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回 0 。
如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量 EOF (-1)