C语言的数据类型和变量
数据类型
C语言中的数据类新用来描述数据,而类型可以理解为是数据的分类。
数据类型可以分为以下几个
- 内置类型
- 字符型
- 整型
- 浮点型
- 布尔类型
- 自定义类型
- 数组
- 结构体-struct
- 枚举-enum
- 联合体-union
在下面我们着重讲解内置类型
- 字符型
char 可以创建一个字符型的变量(变量会在下文进行描述,在这知道即可)
- 整形
短整型short int
整形int
长整型long int
更长的整形long long int
他们都可以创建一个整型的变量
- 浮点型
fioat
double
long double
他们都可以创建一个浮点型的变量
- 布尔类型
一个特殊的类型,专门表示真假,由 _Bool 表示
————————————————————————
而在字符型,整型前有一个特殊的关键词修饰他们
他们是关键字 signed和unsigned
signed:表示一个类型带有正负号
unsigned:表示不带有正负号,只有非负数
而在默认情况下,关键字signed一般省略不写
其实每种数据类型都有自己的取值范围,这就是有long,longlong的原因,如果在前面加上关键词**unsigned,**那么在同样长度的内存条里,能表达的最大整数增大了一倍。
变量
数据类型就是为了创造变量,而变量就是经常变化的值,不管在C语言还是在日常生活中
int a;//整形变量
char b;//字符变量
float c;//浮点型变量
这些都是我们创建的不同数据类型的变量
如果我们给变量在创建时就给了一个初始化的值
举个栗子:
int a = 777;
那么就叫初始化
变量的分类
- 全局变量:指在大括号外面定义的变量
- 局部变量:指在大括号里面定义的变量
举个栗子:
int main ()
int a = 10;
{
int b = 20;
return 0;
}
其中a为全局变量,b为局部变量
如果全局变量和局部变量同名时局部变量优先使用
举个例子:
#include <stdio.h>
int main ()
int a = 10;
{
int a = 20;
print("a");
return 0;
}
此代码运行后打印结果应为20
在内存中分为三个区域,分别为:栈区,堆区,静态区(内存不是我们熟知的512g又或者1t,它叫存储空间,而是16g那种的运行内存),其中全局变量放在内存的栈区,全局变量放在内存的静态区
算术操作符
分别有+ , - , * , / , %,当代码涉及到计算时我们可以用这些算数操作符计算
其中+就是加法,-就是减法,*就是乘法,/就是除法,%就是求模,因为这些操作符都会有两个操作数,分别于操作符的两端,所以也叫双目操作符
其中除法较特殊,因为涉及到整数和浮点数,我们在具体讲解:
如果两边都是整数,例如8/2
那么结果会是整数4,但如果是9/2
,结果会是4,因为输出的是整数,所以只会返回整数部分,后边的0.5就会丢失,如果我们想让他输出为小数(浮点数),那么需要除号 / 两边的运算数至少有一个是小数(浮点数)的形态,例如9.0/4
求模运算符中,只能运算整数,不能用于浮点数,如果是负数求模,结果的正负号由第一个正负号决定
赋值操作符
=是一个给变量赋值的操作符
例如:
int a = 1
如果遇到连续赋值
int a = 1
int b = 2
int c = 3
c = b = a + 1
是从右往左计算
可以拆成
b = a + 1
c = b
而为了方便运算,会有一些复合运算符
像是a = a + 1
可以写为a += 1
,像这样的还有-=,*=,/+,%=,等,和前面+=用法相同
单目操作符
++和–,就是给自身本来的值加一或者是减一
int a = 4
a = a++
printf("a")
打印的值为5
因为单目操作符的位置不同,分为在变量前和在变量后++a
和a++
,分别称为前置++ 和 后置++,他们的含义不一样,前置++要是碰到赋值情况,举个例子:
int a = 0
int b = = ++a
他先会给自身加上1后在赋值给b,b的值是1
如果是后置++,举个例子:
int a = 0
int b = a++
他会先给b赋值后再给自身加上1,b的值是0
总结就是:前置++先加后使用,后置++使用在加,前置- -和后置- - 同理
而单目操作符的+和-对应的是正号和负号,在负号前面加上-结果会变为正数
强制转换类型
感觉用的比较少,举个例子:
int a = 7.77777//致敬一下我的高中同学,因为a是整型,后面的赋值是浮点型,这样会报错
//这时用强制转换类型
int a = (int)7.77777
//这时强制转换类型将7.77777转换为整型,不会报错
scanf和printf
个人觉得是比较重要的部分,很多人的启蒙“hello world”就是从这里来的
printf
printf起输出作用,作用是将文本内容输出到电脑屏幕中
printf是标准库的头文件<stdio.h>定义的,所以在使用时应该在使用printf函数之前在源码文件头引入这个头文件
#include <stdio.h>
int main()
{
printf("111");
return 0;
}
代码最上面的那一行就是在源码文件头引入这个头文件
printf函数输出数据有两种常见的格式,一种是像上一个代码一样直接在双引号中输入想要输出的数据,一个就要运用到占位符
常见的占位符有整数占位符%d,字符占位符%c,字符串占位符%s等等
表示格式为:
#include <stdio.h>
int main()
{
printf("%d",5);
return 0;
}
在以上代码中%d占据了一个位置,后面的5来填补这个占据的位置
我们也可以限制printf函数的最小宽度
举个栗子:
#include <stdio.h>
int main()
{
printf("%5d",111);//输出结果为“ 111”
return 0;
}
如果先让他靠前对其,只需要在5前面加一个-
举个栗子:
#include <stdio.h>
int main()
{
printf("%-5d",111);//输出结果为“111 ”
return 0;
}
如果输出大于最小宽度呢?
#include <stdio.h>
int main()
{
printf("%5d",1111111);//输出结果为1111111
return 0;
}
因为只是限定最小宽度,大于最小宽度不会限制
如果想让他输出的值时刻带正负号(因为默认情况下printf函数不对正数显示+)可以选择%+d
这样输出的结果都会带正负号
我们也可以限制他的小数位数
如果我们想保留小数后两位
我们可以这么做:
#include <stdio.h>
int main()
{
printf("%.2f",1.123);//输出结果为1.12
return 0;
}
就是在%f中间加一个{.(你想要保留的小数点后几位)f}
也可以限制字符串的位数,方法与限制小数位数相似,将占位符改写为%.(想限制到的字符串位数)s
#include <stdio.h>
int main()
{
printf("%.2s",aaaaa);//输出结果为aa
return 0;
}
scanf
scanf是一个输入函数,用法与printf相似,下面我写一个基本的代码:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
printf("%d",a);
return 0;
}
如果运行到这一步代码会报错,这时要在代码前面加上#define _CRT_SECURE_NO_WARNINGS 1
像这样:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
printf("%d",a);
return 0;
}
代码就可以正常运行(其中&就是读取a的地址,方便输入)
如果想要输入多个变量,scanf函数可以忽略空白字符(空格,制表符,换行符等),所以在输入数据的时候,有空格和分为几行都不影响,scanf函数解读的原理是,解读用户输入时,先放入缓存,等按下空格键后,按照占位符对缓存进行解读,解读会从上次遗留的第一个字符开始直到读完缓存,或者是遇到第一个不符合的条件的字符为止
占位符的运用和printf函数基本一致,但是在scanf函数中,%c
不忽略空白字符,如果想要强制跳过空白字符,在%c前面加一个空格,即scanf (" %c", &c)
赋值忽略符
这个有点难理解 简单的说就是,如果用户输入的不符合预定格式,会导致解析数据失败
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d",&year,&month,&day);
printf("year month day");
return 0;
}
如果用户不输入对应的格式,例如2024/7、24
程序就会报错
这时,我们运用赋值忽略符*
只要把*
加到任何%后面,该占位符就不会返回值,解析后会被丢弃,相当于此占位符输入的东西不重要,反正都会被抛弃,对程序产生不了影响
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d %*c %d %*c %d",&year,&month,&day);
printf("year month day");
return 0;
}
这样就不会有上述情况产生
这章的内容就讲完啦,因为我也是新手,如果有问题请多多指点,大家一起进步哦(笔芯)