【初识C语言】
本章只需基本了解C语言的基础知识,对C语言有一个大概的认识。
每个知识点都只是简单认识,不做详细讲解,后期我都会详细讲解。
1. 什么是C语言?
C语言是一门通用计算机编程语言,广泛应用于底层开发。C的方式编译、处理低级存储器、产生少量的机器码以及不需语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生定了一套完整的美国国家标准语法,称为ANSI C,作为C语言日,国际标准化组织(ISO)和国际电工委员会(IEC)发布准,也是C语言的最新标准,该标准更好的支持了汉字函数名字编程。
C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
2. 第一个C语言程序
#include <stdio.h>
int main(void)
{
printf("Hello world!\n");
return 0;
}
程序调整:
程序的输出是否在屏幕上一闪而过?某些IDE(集成开发环境)的窗口环境会在单独的窗口运行程序,然后在程序运行结束后自动关闭窗口。如果遇到这种情况,可以在程序中添加额外的代码,让窗口等待用户按下一个键后才关闭。一种方法是,在程序的 return 语句前添加一行代码:getchar();
这行代码的意思是获取用户输入的一个字符,这会让程序等待键击,窗口会在用户按下一个键后才关闭。
2.1 代码解析
#include <stdio.h>
// 包含一个叫stdio.h的文件
// std:标准(standard)
// i:输入(input)
// o:输出(output)
// stdio.h:标准输入输出库头文件
int main(void)
// main():主函数,程序的入口,main()有且仅有一个
// int:main()的返回值类型是整型,int是整型的意思
// void:main()无需传参
{
// {:函数定义开始
printf("Hello world!\n");
// 调用C语言的库函数-printf()
// printf():print(打印) function(函数),即打印函数
// 作用:在屏幕上打印输出Hello world!
// \n:表示在打印完成这句话后换行
return 0;
// returrn:该函数的返回值是0
// 这里的0是int类型数据,正好和前面该函数的返回值类型对应
// 现在可暂时将其理解为程序或函数结束的标志
}
// }:函数定义结束
3. 数据类型
C语言主要有以下几种数据类型:
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
- char类型是字符数据类型,例如
'A'
、'a'
、'1'
、都是char类型的数据
注意:
- char类型的数据用一对单引号引起
- int类型表示整型数据,也就是我们常说的整数,它是存放整数数据最基本的类型,在C语言中,所有的整数默认都是int类型的
- short类型也表示整型数据,它的全称其实是
short int
,顾名思义,其实就是比int类型所占空间小的数据类型 - long类型也表示整型数据,它的全称其实是
long int
,顾名思义,其实就是比int类型所占空间大的数据类型 - long long类型也表示整型数据,它的全称其实是
long long int
,顾名思义,其实就是比long类型所占空间大的数据类型 - float类型表示浮点型数据,也就是我们常说的小数,它表示单精度浮点数,同时它也是最基本的浮点数类型
- double类型也表示浮点型数据,它表示双精度浮点数,在C语言中,所有的浮点数默认都是double类型的
下面解释下具体什么是单精度浮点数和双精度浮点数:
- 它们都表示浮点数类型,也就是我们常说的小数,或者说是带小数点的数
- 双精度浮点数比单精度浮点数的精度高,也就是说双精度浮点数后面的小数位数比单精度浮点数的小数位数多
3.1 数据类型的大小和sizeof()
在C语言中可以调用
sizeof()
来查看某个数据类型的大小,即某个数据类型在内存中占用的空间大小,下面是一些具体的示例(每行代码后标明了程序的输出结果):
#include <stdio.h>
int main(void)
{
printf("%d\n", sizeof(char)); // 1
printf("%d\n", sizeof(short)); // 2
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof(long)); // 4
printf("%d\n", sizeof(long long)); // 8
printf("%d\n", sizeof(float)); // 4
printf("%d\n", sizeof(double)); // 8
}
注:读者现在还不必了解代码中
%d
的具体含义,等到我们讲变量时会详细说明这一部分的内容,现在只需要知道printf("%d\n", sizeof());
可以将某个数据类型的大小打印输出到屏幕上即可
3.2 计算机的存储单元
那么上面查看某个数据类型程序打印输出的这些数字的单位是什么呢?
其实它们的单位是字节,字节是计算机的一种存储单元,其实计算机的存储单元远不止这一种,另外还有比特位(Bit)、字节(Byte)、KB、MB、GB、TB等,下面我们来具体解释下:
我们知道计算机是通电的硬件,只能记录两种状态,即通电状态(1),断电状态(0),那么这就意味着存入计算机的所有数据最后都会被转换成这两种状态。由这两种状态组成的代码叫做机器码,也就是计算机能看懂的代码。
比特位(Bit)
我们知道机器码是由大量0和1这两个二进制数字组成的,那就需要一定的空间来储存每个二进制数字,储存一个二进制数字的空间就叫做比特位(Bit);
字节(Byte)
一个**字节(Byte)**可以储存八个比特位;
KB、MB、GB、TB
1KB = 1024字节(Byte)
1MB = 1024KB
1GB = 1024MB
1TB = 1024TB
至于为什么它们之间的换算是1024而不是100或1000,我们在这里不多做解释,因为这其中牵扯的知识量太多,有兴趣的朋友可以去查下,也可以评论出来(其实是我不懂。。。。。。)
这么换算一下会发现每个数据类型都能储存不少的数据
4. 变量
4.1 变量的概念
生活中总有些值是可变的,如你的年龄、你的体重、你的存款等。
用来存储这些可变的值的内存空间就叫做变量。
4.2 声明变量的格式
我们要想使用变量,就必须先声明它,我们应该怎么声明一个变量呢?格式是这样的:数据类型 变量名称;
,例如:
int a;
int b;
char c;
double d;
注意:
一定不要忘记每条代码后面的 “;”
我们现在可以将它理解为C语言中一条语句结束的标志
4.3 变量声明的含义
我们在声明一个变量时到底在计算机中发生了什么呢?
其实在声明一个变量时计算机主要做了两件事:
- 向计算机的内存请求开辟一块空间用来存放数据
- 告诉计算机的内存我所请求的空间存放的数据类型
4.4 变量的使用
我们既然声明了变量,就要去使用它,那么怎么使用我们声明的变量呢?我们可以这样做:
- 给变量赋值
我们知道我们创建的变量其实就是计算机内存中的一部分空间,我们可以在其中放入一些数据,而向变量中放入数据的这一操作就叫做给变量赋值
4.4.1 给变量赋值的格式和赋值运算符(=)
正如你所看到的,给变量赋值也有一定的格式,这个格式是这样的:
变量名 = 要存入该变量的数据;
其中的 “=” 叫做赋值运算符,而这条代码就叫做赋值语句
注意:
- 通常情况下,要存入变量的数据应和声明变量时该变量存入数据的类型相一致;
- 一定不要忘记每条代码后面的 “;”
4.5 变量的生命周期和作用域
4.5.1 局部变量和全局变量
我们可以把变量分为局部变量和全局变量两种类型。
- 局部变量
局部变量指声明在函数体({})里面的变量,这种变量只能在该函数体({})内部使用 - 全局变量
全局变量指声明在函数体({})外面的变量,这种变量可以在该程序内的任何地方使用,甚至也可以在整个工程/项目内部使用
4.5.2 生命周期
顾名思义,变量的生命周期就是一个变量在程序中存活的时间线。
- 局部变量的生命周期就是从这个变量被声明到该代码块结束,也就是指后花括号(})
- 全局变量的生命周期就是从这个变量被创建到该程序结束
4.5.3 作用域
作用域就是这个变量可以被使用的区域,比如,局部变量的作用域就是这个变量被声明到该代码块结束,也就是指后花括号(})
4.5.4 基本规则
我们来看下面这个程序:
#include <stdio.h>
int a = 10;
int main(void)
{
int a = 20;
printf("a = %d", a);
}
我们首先声明一个全局变量a,再声明一个局部变量a,那么打印的值会是什么呢?
我们来运行程序看下:
a = 20
可见程序选择打印了在花括号内部的局部变量,这就说明了一点:
当全局变量和局部变量发生冲突时,局部变量优先。
我们也在这里提醒大家:
尽量不要声明两个名称相同的变量名,以免发生争议和冲突
5. 编写一个小程序
接下来我们趁热打铁,使用我们刚刚学习的的知识,简单制作一个小程序,该程序的功能如下:
- 让用户输入两个整数
- 将这两个整数相加
- 将这两个整数相加后的结果打印输出,返还给用户
下面我们一步一步来实现
【1. 让用户输入两个整数】:
我们首先要声明两个int类型的变量用来存放用户输入的两个数字,再声明一个int类型的变量用来存放这两个数字的和,最后给三个变量赋一个初始值,我们一般认为一个存放整型数据的变量的初始值是0,所以该部分的代码如下:
int num01 = 0;
int num02 = 0;
int sum = 0; // sum就是和的意思
做完上一步,接下来我们就要让用户输入两个整型数据,并将它们分别存到刚刚声明的两个变量num01和num02中,那么怎么要求用户通过键盘输入数据并接受用户的输入呢?我们可以调用scanf()
,这是一个函数,可以要求用户通过键盘输入数据并接受用户的输入,具体怎么使用该函数直接看代码:
scanf("%d %d\n", &num01, &num02);
我们来解释下这行代码:
%d:表示要接收一个整型数据,写两遍表示要顺序接收两个整型数据;
&num01和&num02表示把接收的值分别放到num01和num02这两个变量中
【2. 将这两个整数相加】
接下来我们将这两个整数相加,并把结果储存到sum变量中,具体的代码如下:
sum = num01 + num02;
这行代码的逻辑是这样的:
- 计算num01+num02的值
- 将计算出来的值存到sum变量中(赋值给sum变量)
【3. 将这两个整数相加后的结果打印输出,返还给用户】
现在,我们已经得到了最终的计算结果,最后只需要将结果打印出来就可以了,具体的代码如下:
printf("%d\n", sum);
这行代码的%d是一个占位符,它表示以哪种数据类型形式打印后面sum变量中的值,并且指明了sum变量中的值所打印的位置。
\n是一个转义字符,它表示在打印完成后换行
【4. 总结】
至此,我们这个小程序便编写完成了,该程序完整的源码如下:
#include <stdio.h> // 若想使用printf()和scanf(),就必须要先导入这一个头文件!
int main(void)
{
int num01 = 0;
int num02 = 0;
int sum = 0;
printf("请输入两个整数:>");
scanf("%d %d\n", &num01, &num02);
sum = num01 + num02;
printf("%d\n", sum);
getchar();
getchar();
return 0;
}
注意:
这个程序要想解决显示打印结果的窗口一闪而过的话就必须写两个getchar();
,
因为第一个getchar();
读取了前面用户输入数字时敲击的回车,这时若想再让程序暂停,就必须再加一个getchar();
看到这里,如果大家对我的文章感兴趣,可以接着上面的内容看我的下一篇文章:C语言学习指南_1.2