前言:各位小伙伴们,如果文章有错误,可以提出你们宝贵的意见。
引言:这一次呢就让我们来学习一下C语言中的数据类型和变量吧。
生活中呢,我们常常会用到小数,整数等一些数据。那么C语言为了解决这些问题,便有了浮点型,整型,字符型等一些数据类型。具体让我们来看下面的一幅图片。今天呢,我们只认识一下C语言数据中的基本类型。
1 整型
整型又分为短整型(short int)
,基本整型(int)
,长整型(long int)
,双长整型(long long int)
.
.
短整型
#include<stdio.h>
int main()
{
short int a = 3;//这里创建了一个短整型的变量a,
//并进行初始化,初始化就是在创建a的同时并进行赋值
//这里的short int也可以写成short,语法也是支持的
printf("%hd\n",a);//打印短整型的数据要使用%hd占位符
return 0;
}
运行结果
3
.
基本整型
#include<stdio.h>
int main()
{
int b = 5;//这里创建了一个整型的变量b,并进行初始化
printf("%d\n",b);//打印整型使用%d占位符
return 0;
}
运行结果
5
2 浮点型
浮点型包含单精度浮点型(float)
,双精度浮点型(double)
,长双精度浮点型(long double)
.
#include<stdio.h>
int main()
{
double a = 3.14;//这里创建双精度浮点型的变量a
printf("%lf\n",a);//打印双精度浮点型的数据,使用%lf占位符
return 0;
}
运行结果
3.140000
这里仅展示vs2022运行结果
3 字符型
#include<stdio.h>
int main()
{
char ch = 'a';//这里创建字符型的变量ch
printf("%c\n",ch);//打印字符型数据要使用%c占位符
return 0;
}
运行结果
a
看到这里呢,相信大家对于C语言中的数据类型和变量已经有了一个初步的认识。接下来让我们学习一个特殊的数据类型。
4 布尔类型
.
布尔类型
布尔类型是一个专门用来表示真假的数据类型,取值范围只有两个,true
或者false
。使用布尔类型需要包含头文件stdbool.h
在C语言中,0表示假,非零表示真。
#include<stdio.h>
#include<stdbool.h>
int main()
{
_Bool a = 3;//这里使用布尔类型创建变量a,并初始化为3
if(a)//这里表示如果a为真,就打印I like to learn C language
{
printf("I like to learn C language\n");
}
}
运行结果
I like to learn C language
看到这里,大家可能会想,表示整数为什么需要这么多的整型类型,用一个整型类型不就可以了。那是因为不同的数据类型代表的长度不一样,使用不同的数据类型可以创建出不同长度的变量,存储数据的范围也会有所差异。
5 sizeof 操作符
sizeof
是一个关键字,也是一个操作符,专门用来计算数据类型长度的,单位是字节。
sizeof
的操作数可以是类型,也可以是变量,表达式。
#include<stdio.h>
int main()
{
printf("%zd\n",sizeof(char));
printf("%zd\n",sizeof(_Bool));
printf("%zd\n",sizeof(short int));
printf("%zd\n",sizeof(int));
printf("%zd\n",sizeof(long int));
printf("%zd\n",sizeof(long long int));
printf("%zd\n",sizeof(float));
printf("%zd\n",sizeof(double));
printf("%zd\n",sizeof(long double));
return 0;
}
运行结果
1
1
2
4
4
8
4
8
8
.
需要注意的是,sizeof
的返回值类型是size_t
,需要使用%zd
占位符,不能使用%d
占位符。
.sizeof
中的表达式是不参与真实计算的.
#include<stdio.h>
int main()
{
int a = 10;
short b = 3;
printf("%zd\n",sizeof(b=a+1));
printf("%d\n",b);
return 0;
}
运行结果
2
3
6 unsigned和signed
C语言中使用unsigned
和signed
关键字修饰整型和字符型。unsigned
表示一个类型不带有正负号只能表示0和正整数。signed
表示一个类型带有正负号。对于int
类型来说,signed int
等同于int
,因此signed
一般省略不写,unsigned int
等同于unsigned
。但是对于字符型来说,signed char
不等同于char
。
#include<stdio.h>
int main()
{
signed int a = 3;
printf("%d\n",a);
return 0;
}
运行结果
3
使用unsigned
的好处是同样长度的内存,能够存储的最大整数值增大了一倍。可以根据下图对比。
7 变量的分类
.
全局变量:在大括号外部定义的变量。在整个工程中使用都是可以的。
.
局部变量:在大括号内部定义的变量。使用范围有限。
#include<stdio.h>
int a = 5;//全局变量
int main()
{
int b = 3;//局部变量
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
运行结果
5
3
如果局部变量和全局变量名字相同,采用局部变量优先原则。
#include<stdio.h>
int a = 20;
int main()
{
int a = 10;
printf("%d\n",a);
return 0;
}
运行结果
10
全局变量和局部变量在内存中存储在哪里呢?
我们一般将内存分为3个区域,栈区,堆区,静态区。
栈区:局部变量,函数参数。
堆区:动态内存管理(malloc
,calloc
,realloc
,free
)
静态区:全局变量,静态变量。
8 算术操作符
算数操作符包括加法(+)
,减法(-)
,乘法(*)
,除法(/)
,取模(%)
。这些操作符有两个操作数,因此是双目操作符。操作数位于操作符的两端。
#include<stdio.h>
int main()
{
int a = 4;
int b = 2;
int c = 8;
printf("%d\n",a+b);
printf("%d\n",a-b);
printf("%d\n",a*b);
printf("%d\n",a/b);
printf("%d\n",a/c);//需要注意的是,除号的计算结果是商,如果
//要得到小数,必须至少有一个操作数为浮点型数据
printf("%d\n",a%c);//取模操作符计算的是两个整数的余数,并且
//取模操作符的操作数只能是整数
return 0;
}
运行结果
6
2
8
2
0
4
负数求模的结果的正负号总是由第一个操作数的正负号决定
#include<stdio.h>
int main()
{
int a = 4;
int b = -9;
int c = -2;
printf("%d\n",a%c);
printf("%d\n",b%c);
return 0;
}
运行结果
0
-1
9 单目操作符
单目操作符包括前置++
,前置--
,后置++
,后置--
,正(+)
,负(-)
。
前置++
:先进行+1的操作,再使用
前置--
:先进行-1的操作,再使用
后置++
:先使用,再进行+1的操作
后置--
:先使用,再进行-1的操作
#include<stdio.h>
int main()
{
int a = 3;
int b = 6;
printf("%d\n",a++);//这里先对a进行使用,再进行+1的操作,
//此时a =4
printf("%d\n",++a);//这里先对a进行+1的操作,此时a=5
printf("%d\n",b--);
printf("%d\n",--b);
printf("%d\n",a);
printf("%d\n",-a);
return 0;
}
运行结果
3
5
6
4
5
-5
10 强制类型转换
语法形式为 (类型)
。
#include<stdio.h>
int main()
{
int a = 3.14;//a是一个int类型,3.14是一个浮点型数据,编译器会
//报警告,要想消除警告,就可以使用强制类型转换
printf("%d\n",a);
return 0;
}
#include<stdio.h>
int main()
{
int a =(int)3.14;
printf("%d\n",a);
return 0;
}
运行结果
3
11 scanf和printf
scanf
函数返回值表示变量成功读取变量的个数。如果没有读取任何项或者匹配失败,则返回0;如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
.scanf()
函数除了%c
,都会自动忽略起首空白字符(空格,制表符,换行符等),%c
不忽略空白字符,总是返回当前第一个字符。
#include<stdio.h>
int main()
{
char ch = 0;
scanf("%c",&ch);
printf("%c\n",ch);
return 0;
}
运行结果
如果要强制跳过空白字符,可使用scanf(" %c",&ch)
,表示可以跳过一个或多个空白字符。
#include<stdio.h>
int main()
{
char ch = 0;
scanf(" %c",&ch);
printf("%c\n",ch);
return 0;
}
运行结果
.scanf()
函数遇到%s
,会从当前第一个非空白字符开始读取,直到遇到空白字符(空格,制表符,换行符等)为止。另外,scanf()
函数遇到%s占位符
,会在字符串的结尾隐藏放置\0
。
#include<stdio.h>
int main()
{
char arr[6] = { 0 };
scanf("%s", arr);
printf("%s\n", arr);
return 0;
}
运行结果
.printf()
函数允许限定占位符的最小宽度。
#include<stdio.h>
int main()
{
int a = 123456;
printf("%5d\n",a);//%5d表示这个占位符的宽度至少为5位
//如果不满5位,则前面补空格,默认是右对齐
printf("%8d\n",a);
return 0;
}
运行结果
.
限定小数位数
#include<stdio.h>
int main()
{
double a = 3.14;
printf("%lf\n",a);
printf("%.2lf\n",a);//%.2lf表示保留两位小数
return 0;
}
运行结果
.
输出部分字符串
. %[m]s
表示输出m
个字符的长度。
代码示例1
#include<stdio.h>
int main()
{
char ch[6] = { 0 };
scanf("%4s", ch);//表示最多读取4个字符
printf("%s\n", ch);
return 0;
}
运行结果
**
代码示例2
#include<stdio.h>
int main()
{
printf("%.5s\n", "hello world");//表示输出5个字符
return 0;
}
运行结果
12 赋值忽略符
赋值忽略符(*)
,只要把*放在任意%占位符的后面,表示该占位符不会返回值,解析后将被丢弃。
#include<stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d",&year,&month,&day);
printf("%d %d %d\n",year,month,day);
return 0;
}
运行结果
结语:今天的内容就到此为止了,不知小伙伴们是否有所收获呢。