数据类型
文章目录
1.数据类型
//tr设置行数,td设置列数char | 字符数据类型 |
int | 整型 |
short | 短整型 |
long | 长整型 |
float | 单精度浮点型 |
double | 双精度浮点型 |
使用printf打印出各种数据类型的大小,单位(字节)
# include <stdio.h>
int main() {
printf("%zu\n", sizeof(char));//zu的作用就是打印一个sizeo返回的无符号整型
printf("%zu\n", sizeof(short));
printf("%zu\n", sizeof(int));
printf("%zu\n", sizeof(long));
printf("%zu\n", sizeof(long long));
printf("%zu\n", sizeof(float));//低精度用float
printf("%zu\n", sizeof(double));//高精度用double
return 0;
}
c语言规定:
sizeof(long)>=suizeof(int)
比特(bit)是二进制的简称,一个比特仅代表一个1或0
1个字节(byte)=8比特(bit)
运行结果可得,长度的大小分别为1244848,单位为字节(byte),分别占了8比特,16比特,32比特,32比特,64比特,32比特,64比特
设置数据类型的目的是为了申请空间存储变量的数据
int main()
{
int age = 20;//设置数据类型的目的:是为了向内存申请int(4个字节)大小的空间来存储数据(20)。
double price = 66.6;//这里的age和price便是变量了
return 0;
}
小拓展:其他存储单位之间的关系
- 1KB(千字节)等于1024字节,即1 KB = 1024 B(B代表Byte)12。注意,虽然有时为了方便计算,可能会使用1KB = 1000B的近似值,但在计算机领域,标准的换算仍然是基于2的幂次(即1024,即2^10)。
- 1MB(兆字节)等于1024KB,即1 MB = 1024 KB2。
- 1GB(吉字节)等于1024MB,即1 GB = 1024 MB2。
- 1TB(万亿字节)等于1024GB,即1 TB = 1024 GB2。
2.局部变量与全局变量
当局部变量与全局变量名字相同的情况下,局部变量优先.
当是建议不要将全局变量和局部变量命名相同
int a = 10;
int main()
{
int a = 10;
printf("a=%d", a);//当局部变量与全局变量名字相同的情况下,局部变量优先
}
//输出:a=10
3.数据的输入
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);//因为使用的是vs的环境,而vs的环境不支持scanf的写法,所以会报错,且输入数据需要加入“&”符号来获取数据的位置
int sum = a + b;
printf("%d", sum);
}
报错的信息
严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息
错误 C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. dataSorts D:\VisualStudio2022\代码\dataSorts\dataSorts\dataSorts.c 28
按照报错的信息可知,要么使用scanf_s来解决问题,要么使用CRT_SECURE_No_WARNINGS来解决问题。
然而scanf_s这个函数是vs编译器自己提供的函数非标准的C提供的函数,那也就VS编译器认识,其他编译器不认识!
所以采用后者(_CRT_SECURE_No_WARNINGS)来解决.
3.1报错解决方法:
1.添加标识符
# define _CRT_SECURE_NO_WARNINGS 1
便不再报错
2.直接修改模板
当创建c或c++文件时,是从一个名为newc++file.cpp的文件为模板创建的项目,
我的地址是:D:\VisualStudio2022\vs2022\Common7\IDE\VC\VCProjectItems,下
直接修改会提示权限不足,需要将文件拉到桌面,在桌面修改完成后拉回去,替换原本的目标
如果是移动到桌面,记得要移回去,否则将无法创建c++文件
4.变量的作用域与生命周期
4.1作用域(scope):
简单来说就是这个名字在哪里可以使用,哪里就是它的作用域
1.局部变量的作用域是变量所在的区域的范围。
int main()
{
{
int a = 10;
printf("a=%d\n", a);
}
printf("a=%d\n", a);//此处为未申明的标识符,因为a为上方大括号内的局部变量,作用域仅限于大括号内
return 0;
}
//运行结果显示“a”: 未声明的标识符
扩大其作用域就不会出现未申明的标识符
int main()
{
int a = 10;//将变量a写到更大的括号内,扩大作用域,可以被两个都检测到
{
printf("a=%d\n", a);
}
printf("a=%d\n", a);
return 0;
}
//运行结果为:a=10
// a=10
2.全局变量的作用域是整个工程,在一个工程中的任意地方都可以使用。
int a = 10;//全局变量
void test() {
printf("a——>%d\n", a);
}
int main()
{
test();
{
printf("a=%d\n", a);
}
printf("a=%d\n", a);
return 0;
}
也可以通过extern引入外部的变量,只需声明数据的类型
4.2生命周期:
1.局部变量的生命周期:进入作用域周期开始,出作用域周期结束
2.全局变量的生命周期:整个程序的声明周期
5.常量
c语言中的常量分为分为以下几种:
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
5.1字面常量
int main() {
30;
6.66;
'c';//字符类型
"字符串";//双引号引领字符串
}
5.2const修饰的变常量
常变量:常量的属性,变量的性质
int main(){
int a = 10;//此处的a是普通的变量,可以进行修改
a = 20;
printf("%d", a);//输出结果为:20
}
使用常变量修饰后
int main(){
const int a = 10;//此处的a是使用const修饰后的变量,后续不可进行修改
a = 20;
printf("%d", a);
}//运行后报出 ”错误 C2166 左值指定 const 对象“ 的错误不能对const修饰的变量进行修改
硬性需要常量的地方,无法使用常变量来代替
int main(){
const int a = 10;//将a修饰为常量
int arr[a] = { 0 };//创建数组的硬性条件是a处的参数是常数
}
//运行结果报错:“错误 C2057 应输入常量表达式“
//常变量只是具有常量的属性,但本质还是变量
5.3define定义的标识符常量
int main(){
#define Max 100
#define Str "标识符不仅可以是整数"
printf("%d\n", Max);
printf("%s", Str);
return 0;
}
值不能进行修改
#define Max 100
Max = 200
//运行结果:报出”错误 C2106 “=”: 左操作数必须为左值“
5.4枚举常量
使用enum关键字来说明,内容为常量,应用形式:enum 类型 名称 = 枚举常量,来调用,枚举常量不可修改
enum color//这里只是类型
{
//着三个便是列举出的常量,因为实在枚举中所以被称为枚举常量
red,
green,
blue
};
int main(){
int num = 10;
enum color c = red;//创建了一个color类型的变量名为c(c就是像向内存申请的空间,用来存放red),
//里面可能的取值就是我们的枚举常量
//枚举常量同上的标识符常量一样不能修改
return 0;
}
6.字符串
"helloWorld!"
这种由双引号(Double Quote)引起的一串字符称为字符串字面值(string literal),或者简称字符串
字符串的末尾都带有一个“\0”来规定结束的地方
6.1有无"\0"的输出区别与长度区别
int main() {
char arr1[] = "asdfgh";//通过调试——>窗口——>监视,可知是添加" / 0"作为结尾
char arr2[] = {'a','s','d','f','g','h'};//未添加\0,结尾未知,长度未知
return 0;
}
//注:字符串的结束标志是一个\0的转义字符,在计算字符串长度的过程中\0是结束的标志,不算作字符串的内容
运行结果:
有\0结尾的正常输出,没有\0结尾的一直在寻找\0的位置,乱输出
6.2尝试使用监视查看调试过程
6.2.1.监视步骤:
调试——>逐语句(F11),此时开始调试,并可以通过调试——>窗口——>监视来获取当前的状态
(调试状态下才可监视,不然代码跑太快,还没监视就跑完了)
6.2.2.选择监视器后监视的过程:
双击添加监视要监视的项——>输入要监视的项的名称(本例子中的名称分别为arr1和arr2)——>点击逐过程(F10),就获取了对应的数据
我们在数组的末尾添加上一个“\0”,两个(arr1和arr2)的输出结果将会一致
#include <stdio.h>
int main() {
char arr1[] = "asdfgh";//通过调试——>窗口——>监视,可知是添加" / 0"作为结尾
char arr2[] = {'a','s','d','f','g','h','\0'};//同上可知包含着正常的元素,而不是以"/0"结尾
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}//输出结果:asdfgh
// asdfgh
使用strlen(string length)打印出字符串的长度
#include <stdio.h>
#include <string.h>//调用strlen函数需要导入string的头文件
int main() {
char arr1[] = "asdfgh";//通过调试——>窗口——>监视,可知是添加" / 0"作为结尾
char arr2[] = {'a','s','d','f','g','h'};//同上可知包含着正常的元素,而不是以"/0"结尾
int strlens1 = strlen(arr1);
int strlens2 = strlen(arr2);
printf("%d\n", strlens1);
printf("%d\n", strlens2);
return 0;
}
//运行结果:6(隐形的\0前面的字符数量)
// 33或者说不稳定(为规定\0(字符串结束的位置)一直向右寻找\0,知道33个字符后找到\0,所以显示为33,这种运行结果是不准确的,所以一定要规定\0(结束的地方
ar arr1[] = “asdfgh”;//通过调试——>窗口——>监视,可知是添加" / 0"作为结尾
char arr2[] = {‘a’,‘s’,‘d’,‘f’,‘g’,‘h’};//同上可知包含着正常的元素,而不是以"/0"结尾
int strlens1 = strlen(arr1);
int strlens2 = strlen(arr2);
printf("%d\n", strlens1);
printf("%d\n", strlens2);
return 0;
}
//运行结果:6(隐形的\0前面的字符数量)
// 33或者说不稳定(为规定\0(字符串结束的位置)一直向右寻找\0,知道33个字符后找到\0,
//所以显示为33,这种运行结果是不准确的,所以一定要规定\0(结束的地方)