[C语言]C语言基础学习第一篇:C++入门(1p)

Introduce


本人作为普通本科,大二自学计算机相关知识,现在是在b站视频上自学c语言的基础

还请各位大佬轻点骂,还希望有越来越多的自学者和我一起交流学习。

封面meta的是b站up泛式的封面。底下的漫画是迷宫饭

视频出处:C语言编程2023C语言零基础视频教程C语言入门初学者小白C语言考研C语言专升本C语言期末考试不挂科C语言程序设计C语言期末突击C语言视频教程谭浩强)_哔哩哔哩_bilibili

这里放一张可爱的七草荠,嘻嘻🤭(●'◡'●)

本次我将把p1 - p 10 简单易懂地总结下来,其中会用到有道云笔记和xmind软件进行更好更容易的理解,可能还会用到手写拍照。第一次写会有些拙劣,还请各位谅解。

大致的内容有如下

  1. C语言是什么
  2. 数据类型
  3. 常量变量

C语言是什么呢?

人与人之间为了相互了解就会使用一种规定的语言来进行信息的交流,那么计算机与人之间的交流就需要计算机语言的出现。这些计算机语言又比如说像是:C++/java/python/go语言等等很多。

C语言呢就是一门通用的计算机编程语言,广泛运用于底层的开发。更加具体的概念可以百度一搜就有,这里有个词叫底层开发。这里面有涉及到计算机组成原理,操作系统的知识,不过不用担心,我会解释给你听。

底层开发:

这张图是在做操作系统整理的时候搞出来的一张关于计算机系统的层次结构图,作为用户的我们买来一个电脑,我们可能会非常头疼。啊!这机器怎么组装啊,会不会我组装到后面会坏掉啊。所以我们有的人会选择到实体店里面去直接找人组装好直接用就好了。那么那些头疼的机器零件就是我们的裸机,就是硬件。我们用户作为一个小白只是为了打游戏,看电视,肯定不会去选择了解一整个计算机底层是如何运作的(里面都是程序员辛苦的毛发 呜呜呜),所以就有操作系统和应用软件的出现,让我们的整个电脑操作非常简单易懂。那么C语言就是在操作系统和应用程序这里发挥作用,作为底层开发的重要工具。这一整个过程也比较像是python里面封装的过程。

语言的规则

关于C语言的诞生,我们也有一个非常正规的国际标准。二十世纪八十年代,为了防止各个开发厂商用的C语言语法产生差异,就由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称作:ANSIC.

关于C语言的历史,我看到一个b站视频:【冬至】这个世界缺少对C语言的敬畏,你不了解的C语言故事_哔哩哔哩_bilibili

讲解非常幽默风趣,非常好理解。

C语言的编译器:

编译器如果用非常简单的说法就是你写作文,电脑上有word,note等软件方便做笔记,而且它内部有着很多功能方便你去理解。如果你手写,效率相较于电脑上打字就比较效率底下(当然你习惯用纸笔记笔记,那用纸笔记笔记也没什么问题)。

主要的编译器有:Clang, GCC, WIN-TC, SUBLIME, MISVC, Turbo C等。

我自己用的就是Visual Studio 2022, 它集成了MSVC这样的编译器 -- 可以编写和编译C语言的代码。

我是Visual Studio 2022,假如你选择其他的版本出现了一定的问题,我也不一定知道怎么解决。

关于Visual Studio 2022 如何下载安装,我就不教了,相信CSDN有着非常详尽的教程。

C语言代码的编写

C语言代码的编写的步骤大致如下:

  1. 创建一个新的项目
  2. 创建一个源文件
  3. 编写你的代码
  4. 编译代码

创建新项目

1.我们先选择我们所需要的C语言,我们是学习C++,所以第一步选择Visual C++

2.我们选择空项目

3.我们更改我们的名称,比如说我们第一天的学习我们就写day1

4.位置这里我们一般是D盘里面新建一个文件夹:C++学习,当然你可以随意选择。

创建源文件

当你打开的时候,左侧就是我们的解决方案资源管理器,你就可以在解决方案资源管理器里的源文件写下C++代码。视图里面的解决方案资源管理器就是在你一不小心关闭的时候打开。视图里的一系列功能都是一些可视化的窗口。

什么叫源文件

xxxx.c --- 源文件

xxxx.h --- 头文件

这里新建项就是创建我们的源文件。

这里的.cpp文件就是C++的源文件,同新建项目一样都是可以改名和改位置。

编写代码

//写代数
//1.写出我们的主函数
int main()
{
    return 0;
}

这里的主函数现在基本上是固定的,打代码直接接这么一个套路进去,因为是C++的入门,所以这一期不会非常深入地解释,到后面几期自然会对其中不同的知识点进行非常详细地解释。

主函数是什么呢,主函数就是一个游戏待机状态,只有我们进入游戏内的房间,才会开始进行游戏的游玩。主函数就是入口。

main() 是我们的函数名。

{}就是我们的函数体。

int 就是我们的函数返回类型。int是其中一个数据类型,整型:1, 2, 100。即整数

int main()
{
    printf("我是七草荠的狗");
    return 0;
}

printf - 是我们的库函数之一,意思是在我们的屏幕上打印出相应的语句

当我们使用相应的库函数,我们就要向C++打个招呼(引用头文件 stdio.h, 头文件是记录了库函数的内容)

#include <stdio.h>
// 包含头文件

只要我们写上这一条,我们就能使用printf这一个库函数。

编译代码

编译代码的快捷键有:ctrl + f5/ fn + ctrl + f5/菜单里调试--> 开始执行不调试

编译代码就是将这些代码,变成计算机可以理解的语言。最终计算机给你显示你想要的结果。

右侧跳出来的调试控制台显示出我输入的语句:"我是七草荠的狗"汪!汪!

或许有人会想问,我们的main函数要是有多个会怎么样呢?

这样是不可以的,C++一整个工程中(多个.cpp文件中都只能只有一个main函数)里是不允许有多个main函数的。你可以把C++当作一个迷路的笨蛋,有多个main函数,他就不知道怎么进入房间了。(能一辈子mygo吗)。

小声吐槽,第一次写博客,好长啊,还有好多呀,不知道有多少人看到这里。

你看我封面图改了好几遍

都给我看迷宫饭

咳咳。。 我们开始接下来的学习咯。

数据类型

数据类型呢,就是一个将我们所见所知的东西进行一个简单的分类,比如1,2,3,4,我们就会用整数来称呼他们,“b”,"c",我们会把他们看作语句,1.14514就是我们的小数。数据类型就是将他们进行一系列的分类。

 现在我们简单地把上面的例子写成代码。

int main()
{
    char mygo = 'b';
    int age = 1000000;
    short num = 1;
    float bilibili  = 1.14;
    double  bzhan  = 1.14514
    return 0;
}

这里我们仔细看mygo这一行,char很显然就是我们的数据类型,mygo就是我们的变量名,这个我们这里就将他理解为一个小小的名字叫做mygo的盒子,当我们打开这个盒子里里面就会有个大喇叭喊:'b'。我们就这样将这一语句保存在里面,这个就是对变量的初始化。一般情况下就是我们将一系列相关的数据给初始化,提前命名好。就像我们刚搬进家里,买了一堆盒子,给他们每一个都贴上不同的便利贴用来存放东西,方便以后使用。

在这里,我使用char变量的时候,发现要使用单引号并且最多只能够是4个字母,‘avbc’,或者只能由1个中文,这里面的原因我也在探究,如果知道了我就会立马修改说明原因。

在这里float代表的是单精度浮点数,double代表的是双精度浮点数,双精度与单精度之间简单来讲区别就是双精度就是能记录更多小数位数。

sizeof

int main()
{
    char mygo = 'abcd';
    printf("%d\n", sizeof(mygo));
    int age = 1000000;
    printf("%d\n", sizeof(age));
    short num = 1;
    printf("%d\n", sizeof(num));
    float bilibili = 1.14;
    printf("%d\n", sizeof(bilibili));
    double  bzhan = 1.14514;
    printf("%d\n", sizeof(bzhan));
    long b = 1;
    printf("%d\n", sizeof(b));
    long long c = 2;
    printf("%d\n", sizeof(c));
    return 0;
}

“%d\n”, sizeof(..) 这个语句    “”双引号之中是我们输出是会在黑框里面显示的内容,前面的%d用来表示我们要插入的是一个数据类型为整型的内容插入,比如说我在“”里面填写,我的年龄是%d岁,假如我们在逗号后面填写的是数字18或者是内容为18的变量,则最终会显示出“我的年龄是18岁”。

int main()
{
    int a = 18;
    printf("我的年龄是%d岁",a);
    return 0;
}

sizeof作为关键字,关键字这个概念后面会详细讲诉,关键字就当作是特殊的单词,比如说加减乘除,他们有着特别的用法。sizeof就是用来计算不同计算类型或者变量占据空间的大小。结果如下

或许你好奇这些数字到底代表着多大的空间呢。

上面结果的单位是字节,接下来我来介绍一下计算机中空间的单位。

这里我就用我学习的操作系统的截图来偷懒一下(操作系统里关于性能的内容有讲到),我们只需要看存储容量那一串的内容。

(小声bb,当我初学408内容和之前比赛学过的matlab和校内学的python,发现有很多内容都是有共通的,还是非常推荐各位如果是新生多参加参加比赛,多玩玩不同的软件和看看科普知识。) 

 这里你会发现int作为整型的大小竟然和long长整型是一样的空间大小,这里我就简单的说明,在C语言的标准规定中sizeof(long)>=sizeof(int),这里呢就自动显示为long = int = 4byte。(不是很重要的啦)

这里不同的类型是为了空间的利用更加有效,就像是房间内放箱子,我们不同的物品肯定是要不同大小的箱子进行合理的安排与摆放,使得整个的空间利用率更高。

变量常量

生活中有很多东西是变的,比如说我们的脑内知识,在初中是个小神童,高中是智商巅峰,到了大学我们就每天打个两荤一素顺便加个火腿肠。不变的是什么呢,我们一直都没什么钱。(悲)。

这里我先打出代码

定义变量的方法:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() 
{
	int age = 10;
	float money = 0.00;
	double bread = 0.000000010;
	printf("%d\n", age);
	printf("%f\n", money);
	printf("%lf\n", bread);
	return 0;
}

很难显然在我们的黑框里面我们的bread不能够精确的显示出来,而且小数一般都会不限定的情况下都会直接显示小数后六位。

这里我可以先提前教个小技巧。

当我们在%f里,把%f改成%.8f,这里的”.8“就是显示小数的后8位。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() 
{
	double bread = 0.000000011111;
	printf("%.8lf\n", bread);
	printf("%.2lf\n", bread);
	printf("%.10lf\n", bread);
	return 0;
}

结果很显然。

变量的分类

局部变量和全局变量

我们根据变量的位置,变量会分为两种分类,一种是局部变量,一种是全局变量。

接下来先介绍这两个概念之前,我给你看看我们学校的冬季。

非常的美丽啊, 让我想到了一首歌。

又到了白色相簿的季节~~~~


好!我们回归正题。

// 全局变量 - {}外部定义的
int a = 100;
int main()
{
    // 局部变量 - {}内部定义的
    // 当局部变量和全局变量名字相同的时候,局部变量有限
    // 建议:最好不要把局部变量和全局变量的名字设置为一样
    int a = 100;
    printf("结果到底是什么喵?\n");
    //这里的\n会在后面解释,这个的作用就是最后显示的时候会在后面换行。
    printf("结果为:%d\n", a);
    return 0;
}

忘了说了,//后面是注释的意思,用来解释和方便学习,相当于我们上课做的笔记。注释内不管写什么都无所谓。

关于局部变量和全局变量的区别我就写在了代码里面

重点就是当我们的局部变量名和全局变量名一样的时候,局部变量优先。

这里我们就能看到我们的结果了喵喵喵。


在这里课程内给了一个额外的知识点,这里我也就一起交给你了。

Scanf

假如我们想要输入随意两个数字来求一下他们俩之间的和,我们这里提供了一个新的库函数和printf一样都在<stdio.h>的头文件里面。

我先把代码打出来给你展示一下效果

int main()
{
	int a = 0;
	int b = 0;
	int sum = 0;
	scanf("%d %d", &a, &b);
	sum = a + b;
	printf("我们的求和是:sum = %d\n", sum);
	return 0;
}

首先我们先理解这里的scanf是什么。

scanf就是我们可以输入我们想要输入的东西最终在我们的代码运行之后得到我们想要的结果,就像是我们这里。我们先输入10和10,然后10+10 = 100最后计算出100,下面同理。

这里和printf库函数有一定的相似度,我们要预先输入两个数字,所以就在前面加上%d %d。注意这里我们后面的a和b前面要加上&符号,这个符号到后面我们会详细地讲到,就在这一期。先知道在这里他有这么一个作用。

注意:在我实验的时候发现,假如在scanf里面输入中文和其他符号会出现结果不符合预期,可能它不能够像printf一样在里面加上其他东西。(当然这里我不确定,等我之后稍微查一下这个函数的用法,再改一改。)

scanf这里我们初次使用我们会发现Visual Studio 2022 会立马报错,

 这里有个很简单很蠢的办法,就是我们在我们的每个代码的最开头添上一段话。

#define _CRT_SECURE_NO_WARNINGS 1

这个在我们的报错代码里面就能够看到define后面这一串代码,只要在前面加上#define就能够避免报错的出现。

当然会有嫌太麻烦了,每次在我们运行这个库函数的时候都要加上这一串代码。

这里我们就有一个方法能够永远解决这一个问题。

1.首先我们可以先找到我们的Visual Studio 2022.

 2.我们来到Visual Studio 2022的位置,然后从他的属性找到它的目标,然后复制到文件管理器里的地址。

3. 复制的时候我们要将引号去掉,并且打Community后面的地址都去掉。

4. 搜索那里我们输入newc++file.cpp

5.这里我已经加进入了,我们用文档编辑这个cpp。加上我们之前放在开头的代码。

经过这5个步骤我们就大功告成了。我们以后就不会出现使用scanf库函数报错的情况。


变量的作用域和声明周期

作用域:

这里有一段套话

作用域(scope),程序设计概念,通常来说,一段程序代码中使用的名字并不总是有效/可用的。

而限定这个名字的可用性的代码范围就是这个名字的作用域。

简单来说,就是这个变量常量在那个范围能够使用,有点像数学里的x的范围:[-1, 1]

局部变量的范围:
int main() 
{
	printf("hehe\n");
	//printf("%d\n", a);
	{
		int a = 10;
		printf("%d\n", a);
	}
	//printf("%d\n",a); 
    // 这个printf不管放在{}的前面还是后面都会报错
	return 0;
}

这段代码中我也注释了,在{}里面a的定义它的作用域的范围就只能在{}里面,出了{}a这个变量就无法使用。

如果在{}外面就会出现这个报错。

全局变量的范围:
int g_val = 2023;

int main() 
{
	printf("1:%d\n", g_val);
	printf("hehe\n");
	//printf("%d\n", a);
	{
		int a = 10;
		//printf("%d\n", a);
		printf("2:%d\n", g_val);

	}
	//printf("%d\n",a);
	printf("3:%d\n", g_val);
	return 0;
}

这里的结果非常的显然,如果我们初始化一个变量在main函数外部,这个变量就是一个全局变量,不论在main函数的哪里都是它的作用域。

当然全局变量的作用域其实一整个工程。

我们用代码来试验一下。

首先我们要再创建一个源文件,我最初的文件是"常量变量.cpp",我创建了一个新的源文件"常量变量_1.cpp"。

这里你可以很显然地看到我在新创建的文件里的变量AOT,在原文件中被标红线了。

执行之后:

那么原因是什么呢?
原因是我们没有在原来的文件里声明这个变量,就像是我们是一个i人社恐,然后你的e人外向朋友强行带了一个你不认识的人,你肯定会很难受,所以只要我们事先说明,我们就会有一个心理准备。

extern int g_val;

extern 就是将同一文件下的其他源文件里的全局变量进行声明。

结果就能正常进行了,来试试吧!

生命周期

变量的生命周期是什么?

生命周期就是一个变量的创建和消亡的这段时间,就是我们的生命周期。

不知道你们玩不玩大逃杀类型的游戏啊,对于我们的局部变量,就是我们这个{}就像是一个毒圈,我们出这个毒圈立马死亡,那么毒圈就像是他的作用域,就是他能运动的范围。出了作用域它就不能运行了,也就被毒圈堵死了。所以当我们运行代码的时候,对于局部变量的生命周期就是他的范围就是{}(它的作用域)。所以全局变量的生命周期就是main函数的运行周期,main函数运行的时间就是全局变量的生命周期。

常量

我们将常量分为以下几类:

1.字面常量

2.const修饰的常量

3.#define定义的标识符常量

4.枚举常量

字面常量
int main()
{
    // 1.字面常量
    3.1415;
    1.14514;
    "abcdef";
    "a";
    return 0;
}

字面常量就是很简单的将数字和语句输入到main函数里面。

 const修饰的常量
int main()
{
    const int num = 10;
    num = 20;
    printf("%d\n", num);
    return 0;
}

我们这里可以看到原本是变量的num加上了const就会变成常变量,不能够发生变化,但是常变量的本质是变量。接下来你可以用代码证明这一点。

int main()
{
    int arr[10] = {0};
    const int n = 10;
    int arr[n] = {0};
    return 0;
}

这里arr相当于是数组的意思,我们可以理解为一个一个个连接的抽屉,编号由0开始。所以我们相当于设定十号编号的箱子内是0

然后arr在c语言的设定里,[]里只能够是常量。当我们执行这个代码的时候可能会出现报错。

如果你是.c文件的话,就会出现错误。

 这就说明我们const 修饰的变量实质上还是变量。

但是如果你的文件是.cpp文件的话,就不会有任何报错,C++自动把const修饰的常变量作为常量。

#define定义的标识符常量
# define a 100
int main()
{
    int n = a;
    printf("%d\n", n);
    return 0;
}

#define可以在main函数外设置常量。然后给我们的变量赋值。

#define a 100
int main()
{
    int n = a;
    n = 10;
    printf("%d\n", n);
    return 0;
}

这里我们给n赋值,n是变量,所以可以将n的值进行更改。

枚举常量
enum Sex
{
    Male,
    Female,
    Secret,
    helicopter,
    transgender,
    lesbian,
    gay,
};

int main()
{  
    printf("%d\n", Female);
    printf("%d\n", Male);
    printf("%d\n", Secret);
    printf("%d\n", helicopter);
    printf("%d\n", transgender);
    printf("%d\n", lesbian);
    printf("%d\n", gay);
    return 0;
}

这里枚举常量我们就先混个眼熟,这里的enum就是英语里的enumerate(列举),我们代码里面创建了一个Sex的列举,我们列举里面有很多不同的政治正确,然后我们在main函数里面打印对应的性别,我们最后打印出来的是性别在我们Sex列举的序号。比如说我们的Female在Sex里面排的是第二,所以我们最后代码打出来的就是2开头。

当然我们也可以在我们列举的第一性别后面加上别的数字,使得整个列举的排序不同。

    Male = 10,


ok,感谢各位能看到这里啊,我写这个博客写了三天,本来是很基础的东西,结果真让我写一篇博客让每个初学者能简单易懂地理解真的是累啊。我本来是要写视频里地p1-p29一口气写在第一期里的,但是这太花费我时间了,我就慢慢更新慢慢写了。我光写到p10就已经是8500多字了。

非常非常感谢你们的阅读!!!!!!!

QQ:772790090

可以和我一起自学,或者你喜欢二次元,美式鬼畜,apex都可以加我一起聊聊天,一起写博客。

当然这个第一期有很多地方可能要改......

悲。

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值