数据类型和变量的深入理解

引言:C语言数据类型的意义,数据在内存中的存储情况,变量的声明与定义的区别,和一些关键字。


 

目录

1.变量的定义与声明

1.1定义与声明

 1.2 变量的初始化与赋值

2.C语言常见的数据类型

 3.变量的作用域与生命周期

4.signed 和 unsigned

5. 强制类型转换

6.操作符 + - * /(加减乘除)和 = (赋值操作符)

7. 前置++,后置++,前置--,后置--

示例代码1(后置++):

 示例代码2(前置++):

 8. printf 和 scanf

拓展:

1.限定宽度:

2.控制浮点数的打印位数

3.scanf在读取时是否会读取空格和换行(回车)

结语:



 

1.变量的定义与声明

1.1定义与声明

所有的变量在定义时都会在内存中开辟一块空间

int main()
{
	int a;//变量a的定义,为a在内存中开辟一块空间
	return 0;
}

图解:

 声明可以声明无数次,而定义只能定义一次,多次定义会报错。

int main()
{
	int a;
	int a;
	return 0;
}

 

extern a;//声明完就可以使用该变量

 1.2 变量的初始化与赋值

赋值操作符:  = 

将等号右边的数据赋值给左边。

初始化:

int main()
{
	int a = 12;//在内存中给a开辟一块空间,并将12写进这块空间
	return 0;
}


2.C语言常见的数据类型

数据类型的大小(字节):

这里会使用关键字 sizeof;注意sizeof 是关键字,不是函数。

#include <stdio.h>
int main()
{
	//整形
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof(short));
	printf("%zd\n", sizeof(long));
	printf("%zd\n", sizeof(long long));
	//浮点型
	printf("%zd\n", sizeof(float));
	printf("%zd\n", sizeof(double));
	//布尔型
	printf("%zd\n", sizeof(_Bool));
	//字符型
	printf("%zd\n", sizeof(char));
	return 0;
}

 运算结果:

整形:就是能存储整数

浮点形:就是能存小数

布尔形:就是判断,值为true 或 false

#include <stdbool.h>//使用布尔类型的数据时需要包含的头文件
#include <stdio.h>
int main()
{
	_Bool a = true;
	if (a)
		printf("haha\n");
    return 0;
}

字符型:就是可以存放字符数据,每个字符都对应着一个0~127数字.所以在内存中存储的字符实际上是字符所对应的数字的二进制形式。


 3.变量的作用域与生命周期

局部变量:在代码块中定义的变量

全局变量:在代码块外定义的变量

int g_val = 10;//全局变量
int main()
{
	int a = 12;//局部变量
	return 0;
}

作用域:就是变量的作用范围

生命周期:变量在内存中被开辟到释放的这段时间

作用域与生命周期的差异:

作用域是描述的是空间;生命周期是时间。

局部变量的作用域为这个代码块,生命周期为进入这个代码到结束这个代码块。

全局变量的作用域为其所在的整个文件,生命周期为定义这个变量到整个程序结束。


4.signed 和 unsigned

signed 是有符号的意思

unsigned 是无符号的意思

#include <stdio.h>
int main()
{
	signed int a = -10;
	unsigned int b = -10;
	printf("%d\n", a);
	printf("%u\n", b);
    printf("%d\n", b);
	return 0;
}

问题:你感觉-10是否能存进b中呢?

这里附上结果:

答案:-10 可以存进变量b 

 图解:


 

5. 强制类型转换

强制类型转换操作符 : (类型)

#include <stdio.h>
int main()
{
	float a = 1.3f;
	int b = (int)a;//将浮点数1.3 强制转换为int 及只保留小数点之前的的数字
	printf("%f\n", a);
	printf("%d\n", b);
	return 0;
}

结果:

 


6.操作符 + - * /(加减乘除)和 = (赋值操作符)

+ -  *这里就不多介绍了,这里主要介绍除

= :将等号右边的数据赋值到左边。

大家感觉以下的代码的结果是什么?

#include <stdio.h>
int main()
{
	int a = 1;
	int b = 2;
	float c = a / b;
	printf("%f\n", c);
    return 0;
}

 答案:

 原因:

因为a 和b 都是整形,两个整形相除结果只保留整数部分,如果a或b中有一个及以上的浮点数,那么结果就是0.5。

代码如下:

#include <stdio.h>
int main()
{
	float a = 1.0;
	int b = 2;
	float c = a / b;
    printf("%f\n",c);
    return 0;
}

结果:

 


7. 前置++,后置++,前置--,后置--

++a;//前置++

a++;//后置++
//使用完a的自加1
//相当于 a = a+1;

--a;//前置--

a--;//后置--
//使用完 a的自减1;
//相当于 a = a-1;

前置与后置的区别:

前置:先使用后++

后置:先++后使用

示例代码1(后置++):

#include <stdio.h>
int main()
{
	int a = 1;
	int b = a++;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

 结果:

 解释:先将a赋值给b,a再自加1.

 示例代码2(前置++):

#include <stdio.h>
int main()
{
	int a = 1;
	int b = ++a;
	printf("%d\n", a);
	printf("%d\n", b);
	return 0;
}

 结果:

解释:

先a自加1,然后再将a的值赋值给b 

--这里就不做介绍了


 8. printf 和 scanf

printf 和scanf 是库函数,使用时得引用头文件 

#include <stdio.h> //引用头文件

 printf:将内容打印到显示器上。

scanf:从键盘中读取数据。

占位符:就是这个位置的数据可以被替换。

示例代码1(printf):

#include <stdio.h>
int main()
{
	int a = 10;
	printf("a is %d\n", a);//%d 就是 int 类数据的占位符
	return 0;
}

结果: 

%d 被替换为变量a的数据。

示例代码2(scanf):

#include <stdio.h>
int main()
{
	int a;
	scanf("%d", &a);//这句话的意思是将从键盘中读入的int类型的数据赋值给a
	printf("a is %d\n", a);
	return 0;
}

结果:

键盘中输入的12,被写入变量a中。 

常用的占位符:

int:%d;

unsigned int:%u

long : %ld

long long : %lld;

short:%hd

float:%f

double:%lf

char:%c

字符串:%s

size_t:%zd

八进制:%o

地址:%p

百分号:%%


拓展:

1.限定宽度:

#include <stdio.h>
int main()
{
	int a = 12;
	printf("a is %3d\n", a);
	printf("a is %-3d\n", a);
	return 0;
}

 %3d中的3就是限定宽度,限定其宽度至少为3位,如果不足三位则补空格,如果不加符号则为右对齐;加上负号,则为左对齐。

输出结果:

2.控制浮点数的打印位数

示例代码:

#include <stdio.h>
int main()
{
	float a = 1.3;
	printf("%f\n", a);
	printf("%.1f\n", a);//控制小数点后打印一位
	return 0;
}

打印结果:

3.scanf在读取时是否会读取空格和换行(回车)

示例代码1:

#include <stdio.h>
int main()
{
	int a;
	scanf("%d", &a);
	printf("a is %d\n", a);
	return 0;
}

 

结论:scanf在读入非字符数据时,不会读入空格和换行 

示例代码2:

#include <stdio.h>
int main()
{
	char a;
	scanf("%c", &a);
	return 0;
}

输入换行: 

 

输入空格:


问题: 那有没有办法不读入空格和换行呢?

这里有一种写法:

#include <stdio.h>
int main()
{
	char a;
	scanf(" %c", &a);//在%c的前面加上了空格,这样就不会读入键盘输入的空格和换行了。
	printf("a is%c!", a);
	return 0;
}

 输入换行和空格:

结论:在%c的前面加上空格就不会读入空格和换行。 

 


结语:

又是开森的一天,改了个名,寓意遥远的远方就在自己的脚下。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值