初识c语言(一)

小伙伴们大家好啊!今天我们来讲讲c语言入门第一部分,由于是入门,针对的是完全的萌新并且里面的内容也是点到为止,不会进行深度的扩展,所以可能会有小伙伴们说啦,哎呀老兄你咋就说有这有这你咋不讲讲怎么用啊,哎!好兄弟别急我后期会讲,这部分主要是针对萌新让他们有个大概的了解,就跟我们高三一开始复习的时候是一样的,先知道大致的考试的内容再来一个一个的突破,我们也采用这样的方法来给小伙伴们讲讲,好啦废话就这么多我们来开始这部分的内容。

                                                                何为语言

        首先我们先谈谈语言,什么是语言,我们人类之间的语言又是什么呢?例如我们中国人之间的交流用的什么语言呢?当然是中文,美国人呢?当然是英文。我们把这些中文,英文叫做我们人与人之间的语言,我们可以通过语言作为桥梁来告诉我们的同类,我们的目的我们的思想,这就是语言的作用,那我们人与计算机之间又用什么来交流呢?哎这就是用的我们现在要讲的c语言,当然还有c++,python,java等等众多语言,又有小伙伴们要问啦,c语言是一开始就有的吗?当然不是啊!我们来看看中文,中文也有他的进化历史:陶瓷文-甲骨文-金文-大篆-小篆-隶书-草书-楷书-行书随着人类的文明的发展,语言也变得越来越简洁,表达的意思也越来越明确这就是语言的发展,那我们来看看c语言,c语言也有自己的前世今生:最开始的语言为机器语言:机器语言是计算器能够直接识别的程序语言或者指令代码,无需经过翻译每一段操作码在计算机内部都有对应的电路来完成,假如说:10001010,其中的通电表示为1,断电为0,我们普通人看到这个认为的意思为那就是10001010,但是计算机看到这个就会把这段数字当成+的意思,那是谁发明和完善的这些事情呢,我们对这些大佬有个共同的称呼叫科学家,科学家发现这些语言对于我们普通人来说太难呢,要我学会这个简直是要我跑100米超过博尔特,是吧几乎不可能。所以这个机器语言得到了发展,出现了汇编语言比如说10001010这个在机器语言里面为+的意思,汇编语言给这个10001010取了一个新的助记符叫ADD来代替他,我们普通人看到这个ADD肯定是更加的直接明了的懂得他的作用,但是计算机看到的还是10001010因为计算机看到这个比看到ADD更加的清楚,汇编语言之后便是B语言,B语言后便是我们熟知的C语言。

                                                              第一个c语言程序

 这个应该就是我们萌新们很熟悉的一段代码,我们也知道这个代码所打印出来的结果就是hello world,虽然这段代码挺简单的但是它依然有很多的知识点来值得我们萌新学习。第一个我们来学学int mian 和return 0;这两个可以说是c语言中很重要的东西首先来说int,int是一个关键字该关键字代表的类型为整形,main的意思是main函数,那int main()的意思是什么呢?那就是声明main函数有一个整形返回值,好我们再来看看return 0;这个根据字面意思来看就是返回一个值,该值为0大家有没有发现这个之间好像有那么点联系,我的程序的开始得有一个int main()表示main 函数需要一个整形的返回值,而我的结尾就有一个return 0 ;表示返回一个整形0大家是不是就有一种豁然开朗的感觉,这不就是我们语文中所说的首位呼应嘛!但是这样的意义又是什么呢?我们来想想我们做的每一件事情是不是都应该是有开始的标志也应该有结束的标志,比如我们做饭开始的标志是把菜全部准备好,那结束的标志就是菜全部做好,家人们可以一起享受美食了,那我们编程也是一样的,int main()是该程序开始的标志,程序的执行是从main函数开始进入main函数体然后一步一步执行,到return 0;这个结束的标志结束。我们可以举个例子我们要打印10个hello world但是程序的执行永远是从第一个printf函数开始的,为什么呢?因为int main()是程序执行的入口,竟然是入口那么执行的第一段代码也就是离入口最近的函数,也就是第一个printf函数,不是第二个或者第三个。看到这里大家应该能够理解其意思那么这里我们有几个点需要大家注意注意                               

1:一段程序中有且只有一个main函数。下面我们来举几个例子                                             

     不管我们把多余的int main 放到函数体里面,还是外面我们都会发现编译器会报错并且表明main涵数的重定义问题   。                                                                                                              

2:main函数得放到函数体外部不能放到函数体里面  。                                                         

 3:main函数后面括号得是英文的括号不能是中文的。

       

4.有些小伙伴们可能看到有些地方叫void main()啊!大家只用记住这是一个很古老的写法,在有些编译器下压根就编译不过去,大家只用根据最常见的写法写就可以了。

       以上就是对int main() 和return 0的理解,当然还有一些情况我没有列举,但是跟上面的 类型相差不大大家可以自己动动手尝试尝试,大家在初学的时候只需按照最开始的图片写就可以了。好我们说完了int main和return 0,接下来我们就来说说这里面的#include<stdio.h>和printf("hello world")这两个东西。我们先说printf("")这是一个库函数,该函数的作用是用来打印你想要输出到电脑上的东西,我们这里是printf("hello world"),所以我们在运行的时候就能发现上面出现了hello world 这几个单词,但是这个函数并不是我们自己所创建的,是别人创建的,所以我们在使用这个函数的时候是不是得跟别人打一个招呼啊,这就好比你向你的同学借个作业抄一下是不是得跟你的同学说一声:哎大哥作业借我抄一下哈。那么我们c语言也是一样你用了别人创建好的函数是不是得和别人打一声招呼,那么这个招呼是什么呢?就是#include<stdio.h>我们把他叫头文件,这里的stdio我们可以这么理解sta可以理解为standard,这里的i可以理解为input ,这里的o可以理解为output那么连在一起呢就是标准的输入输出的头文件。那这时候肯定就有小伙伴们要问啦哎哎哎我们是不是所有的函数都得用这个头文件啊?当然不是这就好比你想找别人借一只笔却跟他说借一下作业抄抄,你觉得那位好兄弟会把笔借给你吗当然不会,我们后面会遇见strlen这个函数他的头文件就不是#include<stdio.h>而是#include<string.h>。

                                                            

                                                               2.数据类型

我们生活中一定会遇到许许多多的数据,比如在看文章的小姐姐小哥哥们那么现在多大啊?你们可能会说18岁那么这个18岁,那么这个18就是一个数据类型叫整型,那我继续问你,你今天午餐花了多少钱啊?你可能会说15.5,那我们就把这个15.5称为浮点型,那最后问你一下你的名字的第一个字母是什么呀?你可能会说是Y,那我们就把这个Y称为字符型。那我们c语言也就把数据分为三种类型分别为整型,浮点型,字符型。但是我们c语言又对其进行了细分分别char//字符数据类型,short//短整型, int//整形,long//长整形,long long//更长的整形,float//单精度浮点型,double//双精度浮点型啊这个时候可能就有小伙伴问了为什么会有这么多的类型啊,这些类型有啥区别啊这个时候我们就来看一看在这个图片:                                                                                                       

 图片中sizeof的作用是返回一个对象或者类型所占的内存,我们可以看到图片中,我们求出了不同的类型所占的空间的大小分别为1 2 3 4 4 8 4 8,那这个1是什么呢?它的单位是什么呢?是一碗我最喜欢吃的热干面吗?当然不是这个1代表的是一个字节,这个时候又有小伙伴要问了字节是什么?那么我在来给小伙伴们讲讲,我们计算机中最小的内存单位是bit(比特),他能存储什么呢?我们之前前面讲了机器语言,他的样子是10001010之类的,我们计算机能够识别的也是二进制,那么1bit就可以存储一个1或者0,那么8bit就可以创建8个位置来储存数据比如00000000或者10101010,1byte(字节)等于8bit(比特), 1kb=1024byte,1mb=1024kb,1gb=1024mb,1tb=1024gb,1pb=1024tb,所以这里大家应该能对内存有个大概的了解,我们再来看看这个图,一个int的大小为4个字节也就等于32个比特位,我们又知道计算机所能够识别的是二进制,那我们把32列出来,最大的应该是最小应该是11111111111111111111111111111111,最小的应该是00000000000000000000000000000000,根据2进制的计算来看最大应该是2的32次方-1,这时候我们有同学问哎呀哎呀为啥有个-1啊,我咋觉得是2的32次方啊!好我们来一一列举01就是1,10是2,011是3(也就是2的2次方-1),100是4,101是5,110是6,111是7(也就是2 的3次方-1),这个时候大家就应该明白了为什么会减1了,好这个时候大家就会想到我知道了int 的大小范围是0~2的23次方-1也就是0~4294967295,这我只能说半对,因为我们将整形分为有符号整形和无符号整形,上面的范围是无符号整形的范围也就是unsigned int的范围,而我们所谓的int他是有符号的全称应该为signed int ,但是我们在写的时候经常将signed去掉,那么这两个之间有什么区别呢?很明显根据字面意思便可以得知有符号整形他是有正负号的那么我们是怎么来使一段数值中表达出符号的呢?难道是前面加符号吗?当然不是计算机智能识别出二进制于是人们就想到在一段二进制的最高位来表达正负,0表示正,1表示负,那我们来举个栗子:+10应该为00.........01010 ,那么-10呢?我们就把最高位的0(表示是个正数)改为1(表示负数)就为10.........01010,这就是符号整形的表达方式,那么我们在看回来有符号整形的范围是什么呢?这时候有小伙伴们说了啊最高位既然成为了表示符号的东西,那么一共就剩下了31个位置,那么应该就是-2的31次方+1~到2 的31次方-1,那我可要告诉你不对哦!我们来看看一个东西,这个东西叫0正数的0表达方式是不是000........00000,那么按照这么讲的话是不是负数也有个0,表达方式是不是为100..........000000,这个也是0,这就很奇怪+0,-0咋这是求极限吗?还分左极限右极限所以我们就把这个-0(100.......0000定义为-2的31次方)所以有符号整形的范围也就变成了-2的31次方~2的31次方-1,我们再来看看这几个类型便可以很清楚的明白这不同的类型的区别,存整形的就一个char,存整形的有四个short, int, long, long long,这四个的大小各不相同,那我们就知道了大小不同那么存东西的数量也就不同,这时候有些小伙伴们就发现了这个int 和long的大小好像一样的啊,这里啊我们C语言规定了long的大小只用>=int就可以了,这里啊我们的编译器选择的是=。关于浮点型我们是初学只用大致了解一下即可,我们后面一定会详细去讲这个,我们现在就只用知道double的精度比float高就可以了。这时候又有小伙伴要问了,我还是不理解了我还是不理解这到底有啥用啊!我都用储存能力最强的类型来存储不就够了吗?对吧我们买手机喜欢内存大的,我们买房子喜欢面积大的,我们买电脑喜欢屏幕大的,但是在这里不可以哦我们之所以创建这么多的变量对应着不同的储存能力,就是能够更加合理的利用内存,比如说我来创建一个变量来记录一个人的年龄你就得你用long long来存合理吗?对我承认运行确实运行的下去但是产生了很多内存的浪费不是吗?你希望你下载一个王者荣耀大小512G吗对吧,我们类型越丰富我们在储存的时候就有更多的选择,内存在使用的时候也会更加的高效合理。我们再来谈谈如何申请空间例如:int age=20;这个就是创建一个变量并且向电脑申请了空间,创建变量的本质就是向内存申请空间并且向空间里面存入数据。

                                                                   3.变量和常量

         在我们生活中可以将数据的分为两类一种是变量,一种就是常量。根据字面意思也就不难理解变量就是该数据类型可以改变,那常量就是该数据不可以改变,例如我们的体重就是一个变量但是我们数学中的圆周率就是一个常量不可能说你今年高考数学试卷中的圆周率约等于3.14,明年复读一年就变成了3.24对吧那我们就先来说说变量。

                                                                 3.1定义变量的方法

        我们来举几个栗子:我们可以定义一个变量叫年龄age,我们知道年龄是一个可以变的量并且为整形,所以我们在创建这个变量的形式就为int age=18;我们也可以定义一个变量叫体重,但是体重一般都不是整形啊,那我们就用浮点型进行定义那就是float weight=89;我们还想定义一个变量那变量就叫w,那我们可以用char来定义,就是char ch=‘w’;大家注意啊我们在定义一个单字符串的时候得加单引号,这就是我们定义的过程啊有小伙伴们可能就要问啦:我怎么在一些书上看到他们定义变量的时候怎么后面没有跟等于多少多少啊?是不是这样定义也可以啊?答案是不行的我来看看这个图片

   我们可以很明显的看到下面表示了错误并且指出了为a为初始化,这个初始化就是指的我们那个

=10之类的,这里我就建议大家在写代码创建变量的时候最好顺便初始化一下,有些同学可能看到有些书上会出现未初始化的变量,那是因为在下文会出现某个运算或者输入一个值顺便赋值给了这个变量,这个是可以的因为这个赋值的过程也就顺便初始化了一下比如说:

这样我的a并没有初始化,但是我的下面有个输入的函数,并且把值赋给了a这样也是可以的,编译器并没有报错,但是这时候我们的小伙伴又会发现这个输入函数咋感觉不一样啊不应该是scanf吗咋变成scanf_s了呢?这里我再来跟萌新们讲讲哈 首先我们来看看这个图片

我们可以看到下面有一段话哈我们来读读看,他说这个函数或者变量是可能是不安全的建议使用scanf_s去代替他,如果不想看到这个错误可以使用·_CRT_SECURE_NO_WARNINGS。 大家读读这段话便可以明白大概的意思,但是有一点大家需要明白的是scanf_s这个函数是vs编译器自己提供的函数非标准c提供的函数,那也就是只有vs编译器认识,其他的编译器不认识,如果想实现跨平台的话,那么其他的编译器不认识,所以我建议还是使用scanf。那我们如何来解决这个问题呢?我们看到上面的那句话便可以得知使用_CRT_SECURE_NO_WARNINGS我们来看这个图片就知道了

我们在编译器的第一行写#define再加上后面那段话便可以了。 

                                                             3.2变量的分类

        我们将变量分为局部变量和全局变量,我们简单的将这两个进行定义我们说局部变量就是定义在大括号里面的变量,全局变量就是定义在大括号外面的变量我们来看看这张图片便可以知道

那这里我们就有几个问题来讨论讨论:

        一:在同一个范围内我们能不能定义两个变量,两个变量的名字全部都叫a我们来看图

我们可以很明显的看到下面出现了错误的原因:a重定义所以啊大家以后在定义变量的时候不要让名字相同当然英文的大写和小写在我们英语当中是相同的但是在c语言里面这是两个不一样的东西比如我们可以int a=10;后面再定义一个int A=10;这不会出现重定义的问题。

二:我上面写的是在同一个范围内是不能定义两个变量,两个变量的名字相同的,但是在不同的范围内呢?我们再来看一张图, 

大家可以看到我们定义了一个全局变量a和一个局部变量a。首先我们的编译器并没有报错说我们的a重定义,但是我们的printf函数中可以看出来在局部变量和全局变量的重复的时候,我们是以局部变量为先。 但是我们还是建议不要将全局变量的名字和局部变量的名字相同哈。

                                                              3.3变量的使用

        这里我们举个栗子便可以明白

 我们这段代码的目的是求两个数的和,我们首先创建三个变量number1,和number2,sum,并且将其初始化,这是我们就要输入两个我们想要相加的数字这就要用到我们所学过的scanf输入函数,大家注意我们这里是一个函数,里面要输入两个数字我们的”“里面的两个%d注意要用空格隔开,后面的&number1和&number2得用,相隔开。有了输入就要完成我们的求和我们将number1+number2 的和赋值给sum,既然求和完成了就要实现输出,我们这里就用我们之前学的输出函数printf便可以完成我们的目的,但是这里有个地方大家需要注意一下就是我们在笔记本上按了Ctrl Fn F5 后输入那两个数字后记得也用用空格隔开哈,这便是我们变量的使用。

                                                             3.4变量的作用域和生命周期

我们先说一下作用域:这个变量哪里能起到作用,哪里就是变量的作用域,我们可以用官方的话说就是:作用域是程序设计的概念,通常来说,一段程序代码中所用到的名字不总是有用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。我们来看看这两个图片

 第一个图片的可以看出这个变量a的作用域是第二个大括号,而我们在第二个大括号里再调用变量a的话就会出现错误,所以看到这里大家应该能对作用域有一定的了解,局部变量的作用域就是变量所在的局部范围。我们再来看看全局变量的我们先来看一个图片

我们定义了一个全局变量,我们通过运行结果发现这个全局变量不仅在第一个大括号里面可以使用,并且在第二个大括号里面依然能使用,并没用出现局部变量里面出现的,第二个括号里面能使用而第一个不能用,我们再来加强一点,我们创建了一个函数(该知识点我们在后期会详细讲解)如果函数哪都能用的话,那这个函数应该也可以用,我们创建了一个函数,函数的内容就是打印这个变量a,我们可以看到这个函数的内容是可以实现的,并且我们可以创建两个文件,文件1定义了一个全局变量a,那么文件2能否使用呢,我们来看这张图片便可以看出,我们在文件1定义了一个全局变量a,在文件0里面我们要使用这个全局变量a 的话,我就可以使用extern int a来实现跨文件的全局变量的使用,运行一下便可以发现结果是可以使用

 于是我们便可以得出一个结论一个全局变量的作用域是整个工程一个文件可以使用其他文件定义的全局变量。

        我们再来讲讲生命周期:生命周期我们也可以分为局部变量的生命周期和全局变量的生命周期,我们先来聊聊生命周期这个意思是什么,我们可以类比一下假如一颗大树的寿命为1000年那么假如他的生命是重1000年开始,那么他的生命是不是应该在2000年的时候结束,但是一颗大树是不是会产生氧气净化空气吸收二氧化碳,那么他的这个生理工程是不是对大自然和地球是有作用的具体的作用时间为1000~2000那我们通过这个例子再来看看局部 变量的生命周期

 我们定义的这个变量a是不是只有在进入第二个括号的时候才开始了,他的作用域那我们是不是可以认为这个时候他就有了其生命可以使用这个变量并且打印出他的值,当他出了这个括号的时候我们再想使用他的时候便发现用不了了,出了他的作用域那也就是说明他的生命周期已经结束。那我们是不是可以得出结论进入作用域生命周期开始,出了作用域则生命周期结束。那全局变量的生命周期呢?我们前面说了一个全局变量的作用域是整个工程,按照我们定义的局部变量的推理可得全局变量的生命周期是不是就是整个程序啊。看到这里想必大家应该能够明白这个生命周期的意思,那我们就再来看看最后一个知识点常量吧。

                                                              3.5常量  

                前面我们介绍了变量的一系列的知识点,那么与之对应的便是常量,我们将c语言中的常量分为一下几类分别为:字面常量,const修饰的常变量,#define定义的标识符常量,枚举常量。我们先来说说字面常量我们在编译器里面直接输入一个30;这就是一个字面常量,可以再输入一个3.14;这就是一个字面浮点数常量当然也可以是字符常量'w';也可以是一个字符串常量“abcdefg”我们来看个图简单的了解了解当然这些数都是不可以改的,我们了解一下即可

好的接下来我们来了解了解一个很重要的知识点就是const修饰的常变量,首先看个例子我们创建一个变量a并且初始化in a=10 ;然后我们再让a=20;我们再用printf函数输出可以发现a的值发生了改变,它等于20,这时候我们可以得出一个结论,我们定义的这个整型a他是可以改变的。

于是我们再来看下一个例子我们在创建一个变量a的时候在int前面加个const再改变其a的值的时候会发生什么呢? 

 我们发现编译器报错了说不能给这个a赋值,这说明了什么?一个变量他的值不能发生改变那不就是常量了吗,对吗?那为什么我们要给他一个名字叫常变量呢?我们可以这么理解const修饰的a,本质是变量,但是不能被改变,具有常量的属性。可能大家看到这个解释可能也不大了解啥叫本质是变量,但有常量的属性啊!不应该要么是变量要么是常量吗?这时候我们再来看个例子大家就会豁然开朗:我们先定义一个数组int arr[10]={0}这时候我们看编译器并没报错。

于是我们就定义一个变量a让变量的值等于10,这时候我们将变量a代替之前的arr数组中的10会如何?

这是我们发现这里报错了并且说arr[]这个阔后里面得输入一个常量的表达式,那我们这时就应该想到,我们刚刚讲的const in a这是个常变量本质是变量,但是具有常量的性质,那我们能不能试一试我们将int前面加个const再放到数组里面会不会报错呢?这时候我们发现这里依然会报错,并且错误的原因还是因为arr[]括号里面必须得是常量,就算我们加个const也不行,这不就对应了我们之前说的那个吗?本质是变量但是具有常量的性质。看到这里大家应该能够豁然开朗,于是我们便可以这么理解我们可以将变量当成一个水杯,而常量就是水我们用const修饰了变量a相当与把水杯里面装满了水并且用盖子将其封起来,这时候里面的水出不去外面的水进不来,里面水的含量永远是一个具体的量,但是你这时候能说杯子加盖子等于水吗?对吧明显不能,希望这个例子能对大家有所帮助。 好接下来外面再来讲讲#define定义的标识符常量外面先来举个例子

 首先大家要注意的一点就是#define的后面有个空格,再写标识符min,然后再空格写把什么值赋给min,这里大家应该可以发现的一点就是:我们用#define来定义常量的时候是没有说明变量的类型,我们可以直接在标识符后面写你要赋给的值,比如我可以赋一个字符串给ycf这个标识符,我也可以赋一个字符给cf这个标识符。然后还有一点就是我们这里定义的是常量,常量是不能改变的例如

我们将min的值改变变成10,但是这里编译器就会报错说min的值不能发生改变想必看到这里,大家应该能对#define的标识符常量有所理解。最后我们再来看看枚举常量这里大家了解一下即可,在生活中我们有些常量是可以一一列举出来的比如三原色RED, GREEN ,BLUE.那这里我们就可以运用枚举常量 

首先我们先输入一个enum这是枚举的关键字,再定义一个Color这个枚举的类型,再在下面的括号里面输入具体的值,我们都知道三原色的组成是红色,绿色,蓝色,于是我们就在大括号里面输入这些值,我们就把这些值称为枚举常量,那我们怎么使用这个枚举常量呢?比如我们在创建一个整型变量num时的格式是int num =10;那么我们在用枚举常量的时候就是创建一个enum Color类型的变量c,这时候就可以把枚举常量里面的值赋值给c,当然这些值是不能进行修改的比如说我们不能把这里的枚举常量修改成RED=20。这里有一点我们要说的是我们前面的枚举常量其实是不占用空间的,但是我们下面创建变量的时候这时才会向计算机申请空间变量的本质就是向内存申请空间。

        说到这里我们的初始c语言(一)就结束了感谢大家看到了最后,我是叶超凡我的文章尽量保证一个星期出一章,我会从基础讲到进阶来让更多人收益谢谢大家观看,下一章我们会讲解1.字符串,转义字符,注释,选择语句,循环语句,和函数,感谢大家的支持,有问题恳请指出,我们一起改正和进步我们下一章见!

        

  • 24
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶超凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值