数据类型的分析

数据类型

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(结束的地方)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值