文章目录
前言
本章学习的是数据类型的基础部分和变量的相关知识,非常简单。
一、数据类型介绍
数据类型分为两大类:1.内置类型 2.自定义类型
内置类型: 是编程语言中用于声明变量的基本数据类型种类,它在编程时可以直接使用,无需额外的定义或声明。它包括整型、浮点型、字符型、布尔类型。
自定义类型: 它是为程序员提供的一种强大的数据建模工具,能以更抽象、更贴近实际问题的方式来组织和处理数据。它包括数组、结构体、枚举、联合体。
1.内置类型
1.1.整型
短整型 | 整型 | 长整型 | 更长整型 | |
默认值 | short | int | long | long long |
有符号 | (signed) short (int) | (signed) int | (signed) long (int) | (signed) long long (int) |
无符号 | unsigned short (int) | unsigned int | unsigned long (int) | unsigned long long (int) |
注:括号内的可以省略 ,选择使用signed还是unsigned主要取决于具体应用场景的数据需求和取值范围。若数据需要负数,则应使用signed;反之则使用unsigned。对于int类型默认值是带正负号的。
更长整型是在C99中引进.
1.2.浮点型
单精度 | 双精度 | 更大范围 |
float | double | long double |
注:更大范围是在C99中引进.
1.3.字符型
有符号 | 无符号 | ||
字符型 | char | signed char | unsigned char |
注: C语⾔规定 char 类型默认是否带有正负号,由当前系统决定。所以char可能是signed也可能是unsigned.
1.4.布尔类型
布尔类型是在C99中被引进的.用来表示真与假.在之前是由整数0表示假,非0表示真。另外它需要头文件<stdbool.h>.
形式: _Bool ,其取值是ture或者false.
_Bool flag = ture;
if(flag){
printf("flag is ture\n");
}
2.自定义类型
自定义类型比较复杂,这里先跳过。
3.数据类型的长度
每种数据类型都有自己的长度,根据变量的长度,我们要灵活的运用数据类型。
char | _Bool | short | int | long | long long | float | double | long double | |
长度 | 1字节 | 1字节 | 2字节 | 4字节 | 4字节 | 8字节 | 4字节 | 8字节 | 8字节 |
对于长度字节数相等的情况,C语言标准规定:
- sizeof(long) > sizeof(int)
- sizeof(long double) > sizeof(double)
注:1 Byte(字节) = 8 bit(比特位); 1个bit可以放入1个2进制的位.
4.sizeof操作符
sizeof是一个操作符,也是一个关键字,用来计算类型的长度,单位是字节Byte
它有两种用法:
- 1.sizeof (类型);
- 2.sizeof (表达式);
- 注:当表达式是单个变量时,可以忽略小括号。另外表达式不会参与运算,只根据表达式的类型给出大小。
int main() {
int a = 5;
int b = 2;
int c = 0;
printf("%zd\n", sizeof(int) );
printf("%zd\n", sizeof a );
printf("%zd\n", sizeof(a-b) );
printf("%zd\n", sizeof(5-2) );
printf("%zd\n", sizeof(c=a-b));
printf("%d\n", c );
return 0;
}
在VS2022上的输出结果是:
sizeof 的计算结果是 size_t类型的,其占位符为%zd
- 因为sizeof的返回值类型,是根据系统的不同而不同,如可能是unsigned int,unsigned long等,这不利于程序的可移植性,所以C语言创造了⼀个类型别名size_t ,用来统⼀表示sizeof的返回值类型。对应当前系统的 size_t 的返回值类型,可能是unsigned int或unsigned long long。
sizeof中表达式不参与计算
- sizeof是一个静态操作符,它的结果在编译时就已经确定了。
- sizeof的结果与表达式的运行值无关,编译器只需知道表达式的类型,因此不需要执行它。
5.signed和unsigned
它们是修饰整型和字符型
- signed:表示一个类型带正负号。
- unsigned:表示一个类型不带正负号,即只表示0和正整数。
- unsigned的好处:同样长度的内存能够表示的最大整数值增大了一倍。即,若signed表示-10~10,用unsigned则可表示0~20。
二、变量
1.变量的创建
- 变量创建的本质:在内存中申请一块空间。
- 类型的用法:创建变量
其中,经常变化的值称为变量,不变的值称为常量。
语法形态: 数据类型 变量名;
注:创建一个变量后要给一个初始值,这叫 初始化。
2.变量的分类
- 全局变量:在大括号外部定义的变量,它可以在整个工程内使用。
- 局部变量:在大括号内部定义的变量,它只能在自己的局部范围内使用。
#include <stdio.h>
int num = 10; //全局变量
int main(){
int num = 1; //局部变量
printf("%d\n",num);
return 0;
}
当局部变量和全局变量同名时,局部变量优先。
再了解一下变量在内存中存储位置
- 在我们学习的C/C++语言中,有三个内存区域需要我们关注,即:栈区、静态区、堆区
- 局部变量放在内存的栈区
- 全局变量放在内存的静态区
- 堆区是用来动态内存管理的
3.算术操作符(运算符)
操作符有:+ 、- 、* 、/ 、% ,他们都是双目操作符,有两个操作数分别位于操作符的两端。
3.1. + 和 -
它们分别用来完成加法和减法
#include <stdio.h>
int main(){
int a = 4;
int b = 2;
printf("%d\n",a+b);
printf("%d\n",a-b);
return 0;
}
3.2. *
它是用来完成乘法运算的
#include <stdio.h>
int main(){
int a = 4;
int b = 2;
printf("%d",a*b);
return 0;
}
3.3. /
它是用来处理除法运算的 ,它分为两类:整数除法和浮点数除法
整数除法: 操作符两端的变量全部为整数
特点: 即使返回值的变量类型是浮点型,那返回值也只有整数部分,忽略小数部分。
#include <stdio.h> int main() { float a = 5 / 2; int b = 5 / 2; printf("%f\n", a); //输出:2.000000 printf("%d\n", b); //输出:2 return 0; }
浮点数除法: 两个运算数至少有一个浮点数。
#include <stdio.h> int main() { float a = 5 / 2; float b = 5.0 / 2; printf("%f\n", a); //输出:2.000000 printf("%f\n", b); //输出:2.500000 return 0; }
3.4 %
它是用来处理求模(余)运算,就是两个整数相除的余值。这个运算符只能用于整数。
#include <stdio.h>
int main() {
int a = 5 % 2;
printf("%d\n", a); //输出:1
return 0;
}
4.赋值运算符: =
赋值: 在变量创建好后,即初始化后再给一个值。
#include <stdio.h>
int main() {
int a = 0; //初始化
a = 6; //赋值
return 0;
}
5.复合运算符
用来提供自增、自减等操作。
+=: 自增 -=: 自减 *=: 自乘 /=: 自除 %=: 自取余
int a = 1; a = a + 1; //等同于: a += 1; a = a - 1; //等同于: a -= 1; a = a * 1; //等同于: a *= 1; a = a / 1; //等同于: a /= 1; a = a % 1; //等同于: a %= 1;
6.单目运算符
它们有: ++ -- + - (其中+、-表示正负号)
对于++和--,它们分别表示自加1和自减1。又各分为前置型和后置型,它们的区别是先自+1(-1)后赋值,还是先赋值后自+1(-1)
- 前置++和前置--
#include <stdio.h> int main() { int a = 0; int b = 0; int c = ++a; int d = --b; printf("%d\n", a); //输出:1 printf("%d\n", b); //输出:-1 printf("%d\n", c); //输出:1 printf("%d\n", d); //输出:-1 return 0; }
在 c = ++a 中,先进行a的自加1,此时a内的值已是1,然后再将a的值赋给b。 同理,前置--也是如此。
- 后置++和后置--
#include <stdio.h> int main() { int a = 0; int b = 0; int c = a++; int d = b--; printf("%d\n", a); //输出:1 printf("%d\n", b); //输出:-1 printf("%d\n", c); //输出:0 printf("%d\n", d); //输出:0 return 0; }
在c = a++ 中,先将a的值赋给c,接着再进行a的自加1,此时a内的值变为1。同理,后置--也是如此。
+和-
- 对于运算符+来说,它对于正负值没啥影响,写不写都行
如: a = a 等价于 a = +a
- 但运算符-不同,它会改变当前值的正负号。
#include <stdio.h> int main() { int a = 3; int b = -a; int c = -b; printf("%d\n", b); //输出:-3 printf("%d\n", c); //输出:3 return 0; }
7.强制类型转变
在我们写代码时,有时会出现数据类型不同的警告,为了消除警告,我们可以使用强制类型转变
格式如下: (类型)
#include <stdio.h>
int main() {
float a = 5.23;
int b = (int)a;
int c = (int)5.23;
printf("%d\n", b); //输出:5
printf("%d\n", c); //输出:5
return 0;
}
这样5.23就变成整型,只保留整数部分。
但强制类型转变不是一个好方法,能不用就不用。
总结
以上就是数据类型和变量的基础知识了,看一看就记住啦。
标签:--,数据类型,unsigned,C语言,int,printf,类型,sizeof From: https://blog.csdn.net/2302_80293320/article/details/139882768