【声明】:本章主要是对C语言重要内容做一个初步讲解,计划对本章内容做3次更新。
其中代码内容注释较多,可能会给读者造成些许阅读障碍,建议电脑阅读。
由于水平有限,如发现有错误之处,恳切希望读者们批评指正,以免自己或他人入坑!
文章目录
本节重点
什么是C语言?
首先,我们先谈一下什么是语言?
人和人之间就是用语言来交流:比如,汉语,英语,韩语,日语…
其次,什么是计算机语言?
人和计算机交流的语言就是计算机语言:比如,C/C++/JAVA/python/Go语言…
那么,什么是C语言呢?
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易编程的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
注意:什么是底层开发?
对上图的描述:
电脑刚买回来时只是一个硬件,是没法正常工作的要想让它正常工作,需要给它装一个操作系统(你可以装windows操作系统或Linux操作系统),这个操作系统就是去操作硬件的,从而让硬件进行工作。
那么,操作系统如何让电脑硬件进行工作呢?
在电脑(硬件)和操作系统之间有一个层为驱动,这个驱动就是让我们的硬件进行工作的东西,(如:网卡驱动、显卡驱动)。操作系统调用驱动来驱动硬件进行工作。
在操作系统上你可以装各种各样的软件,而在操作系统之上的这一层就是应用层,在这一层一般会装一些应用软件,比如,微信,QQ,网盘等软件。
用户只能感知到应用层,操作系统往下用户就不太了解了,这个向下就叫底层,我们所说的上层就是应用层,下层就是底层。
因为C语言广泛应用于底层开发,所以C语言是特别擅长写操作系统、驱动这样的东西,但是它也可以写应用层上的东西,如早期的wps就是用C语言来实现的。
C语言标准
C语言是有一个C语言国际标准的,它是由美国国家标准局来制定的一套完整的美国国家标准语法,称为ANSIC(标准C)。
早期的标准有C89,C90,C99,C11(但其实C90之后的标准都没有流行起来,因此,我们主要谈的语法都是关于C89和C90相关的一些语法。而衡量一个语言好不好的方法就是看它有没有国际标准。
为什么会有国际标准?
它来自C语言的演变,计算机语言(就是计算机能够识别的语言):这个语言主要指的是二进制语言(就是以10001…这样的二进制序列写代码);
由于用二进制语言写代码太过痛苦,太难记忆,无法普及,于是出现了汇编语言:如ADD,SUB,这种符号被称为助记符(就是帮助你记忆的符号),用这些助记符组成的语言就叫做汇编语言;
汇编语言较容易上手后又出现了B语言、C语言,C语言出现后由于用它写代码很舒服,人们纷纷夸赞并使用,于是C语言流行了。为了防止C语言编译和语法乱套,就出现了C语言国际标准,国际标准规定C语言是什么样子,所有人就必须按照这个标准来写。
认识主函数-我的第一个C程序
C语言代码是如何执行的?
C语言是从主函数的第一行开始执行的,所以C语言代码中得有main函数作为程序的入口, 在C语言代码中,也叫一个工程中有且仅有一个main函数.
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
初识代码详解
- #include <stdio.h>:包含一个头文件,这个头文件的名字叫做stdio.h.
- main叫函数名 ,主函数其实就是一个函数,函数的书写格式就是名词后面带一个括号
- int 是整型(整数)的意思,它是函数的返回类型。即函数执行完之后返回一个整型。
- { }大括号括起来的叫做函数体
- printf 是一个库函数
- 它是在屏幕上打印信息的,打印的内容用双引号引起来。
- printf函数的使用,需要引用头文件stdio.h,因为关于这个函数的信息是放在头文件里面的,其写法就是#include <stdio.h>
- return语句
- 用来结束循环或返回一个函数的值;
- return 0:一般用在主函数结束时,按照程序开发的一般惯例,表示成功完成本函数,即程序正常退出,
- return1代表程序异常退出。
- 返回值是返回给系统用的,是给系统看的。一般做调试到的时候也会用到,当出现错误时可以根据返回值来确定问题出在哪一个函数上面.
``
数据类型
计算机语言是用来–写程序的,写程序是用来–解决生活中的问题的,比如;写一个图书管理系统、图书管理商城等
计算机语言想要解决生活中的问题就必须有能力来描述生活中的问题! 如:购物商城:上架的商品,价格15.6 (小数)=1.56*10^1 数量100(整数) ;
数据类型有哪些?
- char:字符类型,如字符a在C语言中的描述为’a’=字符a;
- int: 整型;
- short int:短整型,也可写为short,它比整型短一些 ;
- long:长整型;
- long long 长长整形 ;
- float:单精度浮点型 ;
- double:双精度浮点型,精度高于单精度;
各个数据类型举例表示
#include <stdio.h>
int main()
{
char ch = 'a'; //ch:创建的一个变量空间叫ch,它用来存放字符a('a')
int age = 20;
short int num = 10;
//long:长整型
//long long 长长整形
float weight = 47.5;
double weight = 47.0;
return 0;
}
研究每一种类型的大小
#include <stdio.h>
int main()
{
//1.在屏幕上打印呵呵、你好
printf("呵呵\n");
printf("你好\n");
//2. 在屏幕上打印一个整数
printf("%d\n",100);
//3.打印每一种数据类型的大小
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
return 0;
}
- printf():是一个函数,函数里面有两个参数:%d和100,%d就是打印一个整数,100就是按照%d(整型)的方式打印
- sizeof是一个关键字,也是C语言中的操作符,它是用来计算变量或类型所占空间的大小。
每种数据类型大小的输出结果
疑问解答:同样是整型,短整型short的空间大小小于整型,那为什么int(整型)和long(长整型)的空间大小都是4个字节呢?
答:在C语言标准中:sizeof(int)<=sizeof(long)。
拓展问题1:sizeof()的单位是什么?
答:是byte–字节;
拓展问题2:计算机中的单位都有哪些?
bit:比特位(计算机中最小的单位)
byte:字节,1byte=8bit
kb:1kb=1024byte
mb:兆b,1mb=1024kb
gb:1gb=1024mb
tb:1tb=1024gb
pb:1pb=1024tb
拓展问题3:一个比特位有多大呢?
答:一个比特位是用来存放一个二进制位的,如:一个1就是一个比特位,比特是计算机中最小的单位。
二进制:由0和1的数字组成
八进制:由0~7的数字组成
十进制:由由0~9的数字组成
拓展问题4:C语言中为什么会出现这么多的数据类型?
答:存在这么多的类型是为了更加丰富的表达生活中的各种值,类型丰富就有了更多的选择,编译时通过选择最适合的类型,可以节省空间,提高空间利用率。
数据类型的使用
数据类型是用来创建变量的,当你要创建一个整型变量时就用int,当你要创建一个字符变量时就用char等。
变量
常量:在C语言中就是指不能改变的量,如生活中的一些不能变的数据:血型、性别、圆周率等。
变量:在C语言中就是指是能被改变的量,如生活中的一些不能变的数据:身高、体重、年龄、工资等
创建一个变量
#include <stdio.h>
int main()
{
int age = 20;
double weight = 75.7;
age = age + 1;//变量是可以改变的量,所以定义之后也可以继续更改
weight = weight - 10;
printf("%d\n", age);
printf("%lf\n", weight);
return 0;
}
- int是变量的类型,age是变量的名字,=是赋值,20是给变量赋的值,一般情况下创建变量时要赋初值。
- double类型小数点后面默认带六位小数。
在C语言中
%d对应打印的是整型
%lf对应打印的是双精度浮点型
%f对应打印的是单精度浮点型
%c对应打印的是字符型
%s对应打印的是字符串
%p对应打印的是指针
变量的分类:局部变量和全局变量
- 全局变量:大括号外部定义的变量都被称为全局变量;
- 局部变量:大括号内部定义的变量都被称为局部变量
#include <stdio.h>
int a= 100;
int main()
{
int a = 10;
printf("%d\n", a);//打印结果为10
return 0;
}
- 为什么打印结果为10而不是100?
- 当局部变量和全局变量名字冲突的情况下,局部优先。
注意写代码时不建议将局部变量和全局变量名字一致。
写一个代码求两个整数的和
#include <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()函数是输入函数,在这里它有两个参数,
- 其中%d表示输入的整型
- &a(取地址a),&b(取地址b)里是输入的数据,即将第一个%d拿到的数字放到a里面去,第二个%d拿到的数字放到b里面去.
变量的作用域和生命周期
作用域概念:通俗来讲就是这个变量在哪里可以使用,哪里就是它的作用域。
eg1:
#include <stdio.h>
int main()
{
printf("hehe\n");
int a = 10;
printf("a=%d\n", a);//a这个变量在这个函数体中可以使用,因此,这个函数体就是它的作用域
return 0;
}
eg2:
#include <stdio.h>
int main()
{
printf("hehe\n");
{
int a = 10;//它是在这个函数体中的
}
printf("a=%d\n", a);//a这个变量在这个函数体中不可以使用,因此,这个函数体不是它的作用域
return 0;
}
局部变量的作用域:是变量所在的局部范围
#include <stdio.h>
int main()
{
printf("hehe\n");
{
int a = 10;
printf("a=%d\n", a);//a这个变量在这个函数体中可以使用,因此,这个函数体是它的作用域
}
return 0;
}
全局变量的作用域:全局变量下面的地方都可以使用,即整个工程(项目),只要在一个工程中即使不在一个文件中只要声明变量后(或方法得当)也可以使用。
拓展:变量的创建可以放在大括号的外面,但是执行性的代码(如:打印,输入,变量赋值)必须放在一个大括号里面去。
#include <stdio.h>
int g_val = 2021;//全局变量
int main()
{
printf("1:%d\n", g_val);
printf("hehe\n");
{
printf("2:%d\n", g_val);
int a = 10;
printf("a=%d\n", a);//a这个变量在这个函数体中可以使用,因此,这个函数体是它的作用域
}
printf("3:%d\n", g_val);
return 0;
}
生命周期:一个人的生命周期就是从出生到死亡,那么一个变量的生命周期是什么呢?
变量的生命周期:变量的创建和销毁之间的时间段。
局部变量的生命周期:进入变量所在的局部范围生命开始,出局部范围生命结束。
一个程序的生命周期就是整个main函数的生命周期,从main函数的第一行开始到最后一行结束。
全局变量的生命周期:整个程序的生命周期。
常量
常量的分类
C语言中常量分为以下几种:
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
下面我们根据例子逐一进行说明
1.字面常量:不会变的常数
#include<stdio.h>
int main()
{
3.14;//浮点型常量
10;//整型常量
'a';//字符常量
"abcdef";//字符串常量
return 0;
}
2.const修饰的常变量
int main()
{
int num = 10;//此时num是变量,num可以被修改。
num = 20;
const int num=10;
num = 20;
printf("num=%d\n", num);//打印结果:20;
return 0;
}
- 上述代码中const修饰num之后,num就不能再被修改了,若修改,则会报错,此时num是常变量。
- 常变量本质上是一个变量,但它具有了常属性(不能被改变的属性),就成为了常变量。
3 . #define定义的标识符常量。
#include<stdio.h>
#define MAX 10000
int main()
{
MAX = 20000;//MAX不能被修改,这样写会报错。
int n = MAX;
printf("n=%d\n", n);
return 0;
}
4.枚举常量:可以被逐一列举的常量。
enum: 枚举关键字
int main()
enum Sex
{
//列出sex这种枚举类型的变量的未来可能取值
MALE=3,//赋初值
FEMALE,
SECRET//这三个值是枚举常量
};
int main()
{
enum Sex s = MALE;//s这个变量只能取三个枚举常量里的其中一个。
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
- 枚举常量是常量,它的值默认从0开始,若赋初值就从初值开始