引言: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的前面加上空格就不会读入空格和换行。
结语:
又是开森的一天,改了个名,寓意遥远的远方就在自己的脚下。