初识C语言(下)

前言

本章内容为初始C语言下半部分,将一些C语言的常见概念进行阐述并不会深层次的探究,后续会深入讲解C语言的,适合初学者能够初步认识到C语言及其常见的概念。高校教育较为注重素质教育和现在的公司需求还是有一定的差距,这篇文章可以为初学C语言的初学者们提供参考,如果你对C语言的整体知识不太了解,可以读一读笔者的文章,带你零基础学透C语言。

一、数据类型的介绍

C语言中把数据结构分为内置类型自定义类型
内置类型:本身自带,可以直接使用。
** 自定义类型**:程序员自己创建,可自己创造想要的类型。
具体数据类型分类如下图:
在这里插入图片描述
①字符型
char
②整型
int — 整型
short [int] — 短整型
long [int] — 长整型
long long [int] — 长长整型(更长整型)
③浮点型
float — 单精度浮点型
double — 双精度浮点型
long double —精度更高的浮点型
④布尔类型(表示真假,0-假 非零-真)
_Bool 现可用 _Bool或bool
注:使用布尔类型要包含头文件<stdbool.h>
使用方法如下:

#include <stdbool.h>
#include <stdio.h>
int main()
{						//false:0	turn:1或者非零
	_Bool flag = true;//或者false
	if(flag)
		printf("hehe\n");//执行并输出
	else
		printf("haha\n");
return 0;
}

二、讨论各种数据类型的长度和计算机中的常见单位

1.讨论各种数据类型的长度

计算各种数据类型的长度使用sizeof操作符(专门是用来计算sizeof的操作符数的类型长度的,单位是字节) ,(size_t是sizeof的别名)。
形式 sizeof (类型)
sizeof 表达式
sizeof的返回值是无符号整型被命名为size_t, 例:
size_t n = sizeof(int)。
代码如下:

#include <stdio.h>
int main()
{	//这里说明:%zd是VS中规定的打印整型,C语言规定的是%d打印整型
	printf("%zd\n",sizeof(char));//1
	printf("%zd\n",sizeof(short));//2
	printf("%zd\n",sizeof(int));//4
	printf("%zd\n",sizeof(long));//4
	printf("%zd\n",sizeof(long long));//8
	printf("%zd\n",sizeof(float));//4
	printf("%zd\n",sizeof(double));//8
	printf("%zd\n",sizeof(long double));//8
	printf("%zd\n",sizeof(_Bool));//1
return 0;
}

结果如下图:
在这里插入图片描述
为什么整型和长整型的长度是一样的?
C语言规定:sizeof(long) >= sizeof(int)
所以在一些编译器中long大于int,但是有的编译器int是大于long的。
注:放在sizeof内部的表达式不会真实参与运算的

#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%zd\n",sizeof(s = b + 1));//2
printf("s = %d\n",s);//s = 2
return 0;
}

2.计算机中的常见单位

2^10 = 1024
bit —— 比特位
Byte —— 1Byte = 8bit
KB —— 1KB = 1024Byte
MB —— 1MB = 1024KB
GB —— 1GB = 1024MB
TB —— 1TB = 1024GB
PB —— 1TB = 1024TB

三、signed和unsigned

signed包含负值,表示一个类型带有正负号。
unsigned表示该类型不带有正负号,只能表示零和正整数。

例: int—>有符号的int == signed int
unsigned int —> 无符号的int(unsigned int里面的int可省略如:unsigned a;)
注:char != signed char, char是有符号的char还是无符号的char,取决于编译器。
unsigned的好处是:同样长度的内存能够表示的最大整数值,增大了一倍。
VS2022: limits.h中有整型类型的取值范围,float.h这个头文件中说明浮点型类型的取值范围。

四、变量

①变量的创建
语法形式:data_type name;
data_type:指的是数据类型,name:变量名。
变量在创建时给赋予一个值叫做初始化。
补充:1.变量名尽量要有意义。
2.变量名的组成只能是字母、数字、下划线并且不能是数字开头。
3.变量的名字不能是关键字!

②变量的的分类
全局变量:在大括号外部定义的变量就是全局变量。
全局变量的使用范围更广,整个过程中想使用,都是有办法使用的。
局部变量:在大括号内部定义的变量就是局部变量。
注:局部变量和全局变量名字冲突的时候,局部变量优先。
电脑上有内存,内存是用来存放数据的,我们创建变量的本质就是在内存中申请一块空间。
C/C++语言的时候,注意三个区域:栈区、堆区、静态区
如图:
在这里插入图片描述

栈区:储存局部变量函数参数。
堆区:动态内存管理。
静态区:全局变量、静态变量的存储。

五、操作符和强制类型转换的介绍

1.算数操作符:+、-、*、/、%

+、-、*、/、%叫算术操作符,这些操作符又叫双目操作符。(即有两个操作数)
例:

#include <stdio.h>
int main()
{
printf("%d\n",34 + 55);//这里的35为左操作数,55为右操作数。
return 0;
}

3x5—>在C语言中,3*5,15÷3—>在C语言中,3/5。
float — %f, int — %d, double — %lf
/ —— 除法操作符
注:① 除号的两端如果都是整数,执行的是整数除法,例:3/2 — 1。
② 如果要计算出小数的效果,那么除号的两端至少有一个数是浮点数,例:3.0/2 — 1.5。
③ %f和%lf打印的时候小数点后默认打印6位小数。%.1f — 打印一位小数

运算符%表示求模(余)运算,即返回两个整数相除的余值。
注:这个运算符只能用于整数,不能用于浮点数。
负数求模的规则是,结果的正负号由第一个运算数(即左操作数)的正负号决定。

2.赋值操作符:=和符合操作值

int a = 10;//初始化
a = 20;//赋值
①连续赋值
注意下面两个代码为了方便讲解写的是一个伪代码,伪代码本身是无法执行的!!!在正式写代码时不要出现伪代码!!!

int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//这里代码是从右向左执行的,c的结果为6

连续赋值:语法上是支持的,但是并不推荐这样写代码。
②复合赋值操作符

int a = 10;
a = a+4;//这里用复合赋值操作符可写为:a += 4;
a = a-5;//这里用复合赋值操作符可写为:a -= 5;

3.单目操作符:++、- -、+、-

3+5 ,4*5 //双目操作符
单目操作符 — 只有一个操作数
①++和- -
++a或a++都是自增1
++是一种自增的操作符分为前置++和后置++
−−是一种自减的操作符分为前置- -和后置- -
不管是前置++还是后置++,都是+1。
前置++:先+1,后使用。
后置++:先使用,后+1。

下面两个代码为伪代码,为了方便讲解:

int a = 5;
int b = ++a;//a = 6,b = 6,先+1,后使用。
int a = 5;
int b = a++;//a = 6,b = 5,先使用,后+1

前置- -:先-1,再使用。
后置- -:先使用,后-1。

②+和-
+是正号,-是负号,都是单目操作符。
运算符+对正负值没有影响
下面为伪代码:

int a = +10;//等价于 int a = 10;
int b = -a;//b = -10;

4.赋值忽略符

有时候,用户的输入可能不符合预定的格式。

#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d",&year,&month,&day);//固定输入格式:2024-0-0,如果非这个格式输入就会报错。
printf("%d %d %d\n",year,month,day);
return 0;
}

为了避免这种情况,scanf()提供了一个赋值忽略符*。只是把*加在任何占位符的占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
例:

#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;
}

上面示例中,%* c就是在占位符的百分号后,加入了赋值忽略符*,表示这个占位符没有对应的变量,解读后不必返回。

5.强制类型转换

形式:(类型)
直接写出的字面浮点数,会被编译器直接识别为double。
精度低用float
精度高用double
下面为伪代码,例:

int a = (int)3.14//把double类型的a强制类型转换为int类型的a,只会保留3。

六、总结

本章内容对一些C语言常见的知识进行了较浅的介绍,但在操作符模块也进行了一系列的较深介绍,后期我也会对操作符进行详解,这里可能没有对printf和scanf进行介绍,这部分内容我会在下篇文章进行讲解,希望这些文章对你有不小的作用,下章我也会对VS上常见的技巧和VS中scanf的报错不能使用的问题进行手把手解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值