C语言中的数据类型和变量

前言:各位小伙伴们,如果文章有错误,可以提出你们宝贵的意见。
引言:这一次呢就让我们来学习一下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语言中使用unsignedsigned关键字修饰整型字符型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;
}

运行结果
在这里插入图片描述

结语:今天的内容就到此为止了,不知小伙伴们是否有所收获呢。

  • 48
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值