一、什么是C语言
什么是C语言,C语言是一门计算机语言,那什么是计算机语言?
就如世界有好多个国家,每个国家的语言可能都不一样,有汉语、英语、俄罗斯语、法语等等,那么按照正常来说,比如中国人,就会用汉语交流,美国人就用英语交流等等,如果要是想中国人和美国人交流,要么中国人说英语,要么美国人说汉语,这样对方才能懂说的话是什么意思
这个比喻就好比计算机语言,计算机语言就是:人和计算机交流,那么我们就需要学习计算机语言,为什么?因为计算机只认识0和1,这个要是在深究的话,请自行百度
那么我们现在有什么计算机语言,比如:C、C++、Java、Python、JavaScript、Go等等,这些都是计算机语言
接下来我们说一下计算机语言的发展史:
早期计算机能识别的语言叫做二进制语言,这个怎么理解呢,就是计算机是一个硬件,但是它要通电,而电分正电和负电,所以也就是我们上面说到的0和1,0为负电,1为正电,它们也被称为电信号
那么我们现在就想让计算机工作,写一段代码,那可能二进制语言表示就是这样的
01010101010010010101011100010001
给计算机输入这样很多的电信号,它是不是特别复杂啊,所以当时写这样代码就要查手册才能写出正确的代码
所以到后来出现了助记符,比如这段代码
010101010
假如这段代码就是表示ADD,就是加法助记符,那我们以后写代码就直接写ADD就好了,也简单了,而这些助记符所表达的语言就是 汇编语言
发现还是非常繁琐,接着就有了B语言,而在B语言的基础上发明了我们所熟知的C、C++等等,从C语言开始我们就称这些语言为高级语言
C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。
解析C语言程序的代码:
// 这个是我们C语言的一个主函数框架,也就是说代码是从这里开始进行执行的
int main()
{
return 0;
}
那我们先来打印一个代码吧
人生的中的第一个C语言Hello World
int main()
{
printf("Hello World\n");
return 0;
}
直接按 F10 debug代码,看一下执行流程
可以看到在第8行有一个小箭头,再按F10,可以看到箭头到了第9行,所以说代码是从main函数开始执行的
我们再创建一个main函数看会怎么样
所以说main函数有且仅有一个
那么这个函数体内还有return 0,这个的意思就是返回0,0是整数,而main() 函数之前的int 就是整型的意思
main()函数之前放int表示 main() 函数调用返回一个整型值
这样return 0,就和int前后呼应的联系起来
但我们是不是在之前看到的C语言的main函数写法是这样的:
void main()
{
}
没错,这个也是我们C语言的写法,但是这种写法已经是过时的写法了,所以我们在写的时候,就不要再这样写了
接着看我们打印函数printf() 这个函数其实是可以拆解的它是分为print和function,顾名思义,就是打印函数
那么这个打印函数又叫库函数,库函数就是C语言本身封装好提供给我们的函数,那么这个就相当于在使用别人的函数
使用别人给我提供的函数就要去 “打招呼” 也就是要去调用一下:
//include叫做包含
#include <stdio.h>
那么这个代码的意思就是包含stdio.h的文件
我们再来拆分stdio.h
- std:标准
- i:input 输入
- o:outut 输出
所以头文件的意思就是标准输入输出头文件
那么我们以后要是写输入或者输入的函数的时候都要引入这个头文件
所以接下来写一个打印代码的完整代码:
#include <stdio.h>
int manin()
{
printf("你好,世界!\n");
printf("我是程序员,是用代码编织世界的工程师\n");
return 0;
}
二、字符类型
char | 字符格式数据 |
---|---|
short | 短整型 |
int | 整型 |
long | 长整型 |
long long | 更长的整型 |
float | 单精度浮点数 |
double | 高精度浮点数 |
我挑几个举例这些都怎么使用:
- char
#include <stdio.h>
int manin()
{
char ch = 'C';
printf("%c\n", ch);
return 0;
}
字符 ‘C’ 可以理解为在内存开辟了一块空间,而 ch 就是对这块空间的命名
那么打印就是 %c 可以理解为一个占位符,即要打印字符格式的数据,也就是打印ch所对应的字符
- int
#include <stdio.h>
int manin()
{
int age = 21;
printf("%d\n", age);
return 0;
}
同样开辟内存空间命名为age,而打印的占位符是 %d ,这个是代表整型十进制数据
- float、double
#include <stdio.h>
int manin()
{
float f = 5.0;
printf("%f\n", f);
return 0;
}
#include<stdio.h>
int manin()
{
double d = 3.1415926;
printf("%lf\n", d);
return 0;
}
这两个对比就可以看出都是输出小数点6位数,double而且还四舍五入了,这也是说明double更加精确
那为什么有这么多的字符类型?对应不用的数值类型?减少内存消耗?
接下来我们围绕着各个字符类型的大小展开理解
那我们接着写代码:
//sizeof() 查看大小
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(char)); // 1
printf("%d\n", sizeof(short)); // 2
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof(long)); // 4/8
printf("%d\n", sizeof(long long)); // 8
printf("%d\n", sizeof(float)); // 4
printf("%d\n", sizeof(double)); // 8
return 0;
}
像他这个输出的结果的数字单位是字节,何为字节?我这里只列举几个
bit
byte
KB
MB
GB
TB
...
计算机最小的内存单位为bit,1byte = 8bit,1KB = 1024开始后面的进制单位都是1024
我们还是看输入的各个字符类型大小的单位都是字节,那这和数据类型很多有什么关系?
因为是在内存开辟空间,就会涉及到开辟大小的问题,那我们看int和short类型,一个是占4个字节,一个是占2个字节
试想一下,我们用int定义了一个人的年龄为21岁,那有没有人是20000万岁呢,肯定是没有的,所以我们在定义年龄的时候,使用short int短整型更较为合适,这样也是较为合理,最重要的是,节省了内存空间
int类型定义的话,会占用4个字节,也就是32个bit位,这样如果定义年龄的话,会显得比较浪费空间,而short定义的话,是节省了int类型的一半空间,long和long long就是更适合更长的整型了
所以每个字符类型是有着更较为合适的类型,减少了内存不必要的消耗
我们还看到了long长整型的长度是4或者8,这是因为跟操作系统和编译器有关,long int长度至少32位,而64位类Unix系统为64位
三、变量
我们生活中有些值是不变的,如:身份证号,血型、圆周率等,那么这些值我们就称为常量
而体重,年龄,薪资等是会变得,这样我们称为变量
1、局部变量
#include<stdio.h>
int manin()
{
int a = 10; // 局部变量
return 0;
}
2、全局变量
定义在代码块外面的变量
#include <stdio.h>
int b = 20; // 全局变量
int manin()
{
return 0;
}
如果局部变量和全局变量同时存在,会优先输出局部变量,比如下面的代码
#include<stdio.h>
int a = 10;
int manin()
{
int a = 100;
printf("%d\n", a);
return 0;
}
同样的变量名字,会优先输出局部变量的值
那说到这里就不得不提作用域和生命周期了
1.作用域
- 局部变量
作用域(scope),程序设计概念,通常来说,通常来说一段代码中所用到的名字并不总是有效或者说是可用的
而限定这个名字的可用性的代码范围就是这个名字的作用域
简单来说就是,这个变量哪里可以用,哪里就是它的作用域
#include<stdio.h>
int manin()
{
int a = 100;
printf("%d\n", a)
return 0;
}
我们看这个上面的代码,这样打印的话是可以直接用的,如果是这样的:
#include<stdio.h>
int a = 10;
int main()
{
{
int a = 100;
}
printf("%d\n", a);
return 0;
}
那么这样的话就是不可用了,这个变量在最里面的括号中,也就是这个变量的作用域
- 全局变量
我们在本工程里面的源代码中再新创建一个源文件,看一下全局变量的作用域
int c_a = 21;
然后在另一个源文件就可以这样使用
#include<stdio.h>
int main()
{
// extern 声明外部符号,就是我们在另一个源文件中创建的变量,这样才可使用
extern int c_a;
printf("%d\n", c_a);
return 0;
}
所以说全局变量是的作用域是整个工程
2.生命周期
变量的生命周期是指变量的创建到变量的销毁之间的的一个时间段
-
局部变量
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束 -
全局变量
全局变量的生命周期是:整个程序的生命周期
那这个声明周期我们是很难用代码解释的,所以这个就是只能是通过字面意思去理解
四、常量
C语言的常量和变量的定义的形式有所差异
C语言中的常量分为以下几种:
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
我们分别来看:
//字面常量
#include<stdio.h>
int main()
{
3;
5;
100;
return 0;
}
//const
#include<stdio.h>
int main()
{
const int a = 8;
printf("a=%d\n", a);
a = 10;
printf("a=%d\n", a);
return 0;
}
在定义的变量前面加一个const,后面再想修改变量的话就不可以了,如果去掉const,那么修改变量是可以的
虽然被const修饰的变量是不可以被被改变的,但是变量本质还是变量,只是不能被修改,所以叫做const修饰的常变量
#define定义常量也是比较方便的
// #define
#include<stdio.h>
#define MIN 22
int main()
{
int arr[MIN] = {0};
printf("%d\n", MIN)
return 0;
}
枚举就是可以被一一列举出来的值
//枚举常量
enum Color
{
RED,
YELLOW,
BLUE
};
int main()
{
enum Color c = BLUE; //使用枚举常量中的BLUE赋值给变量c
return 0;
}
枚举常量就是RED,YELLOW,BLUE 这个三个,这三个也是有值的,并且也是不可被改变的
int main()
{
printf("%d\n", RED);
printf("%d\n", YELLOW);
printf("%d\n", BLUE);
return 0;
}