目录
一、什么是C语言
1、C语言简介
C语言是一门计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译,处理低级存储器,产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但依然保持这良好跨平台的特性,以一个标准规格写出C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机)以及超级电脑等作业平台。
2、C语言发展历史
(1)、C语言是1972年由工作于美国贝尔实验室的Dennis Ritchie所设计,取名为C语言,主要是它源于一种称为B的语言,由其演变而来。
(2)、1963年英国剑桥大学推出了CPL语言虽然该语言很接近硬件,但其规模较大,并未在机器上实现。1967年剑桥大学的Martin Richards对CPL语言进行了简化,推出了BCPL语言。1970年美国贝尔实验室的Ken Thompson 对BCPL语言有进一步简化,设计出了更接近硬件的B语言,并用B语言在PDP-7机器上是实现了UNIX操作系统。
(3)、1973年,Dennis Ritchie 和 Ken Thompson 对UNIX操作系统进行了重写,其中%90以上的代码采用的是C语言,很大程度上提高了UNIX操作系统的可移植性和可读性。
(4)、在以后的若干年中,C语言出现了多个版本,但由于没有一个统一的标准,这些C语言之间出现了一些不一致的地方。为了改变这种情况,1983年,美国国家标准协会(ANSI)制定了一套C语言的标准,称为ANSI C。目前使用的Microsoft c,Turbo C等版本均以ANSI C为标准,同时各自分别进行了一些扩充。
3、C语言的优缺点
C语言功能强大,深受编程爱好者的青睐,主要源于以下一些特点
(1)C语言语句简洁紧凑,使用方便灵活。ANSI C中只有32个关键字和9种控制语句。
(2)运算符丰富,表达能力强。C语言提供了34种运算符,运算类型极其丰富。
(3)C语言程序可移植性好。C语言中没有直接依赖于硬件的语句。
(4)生成的目标代码质量高,运行效率高。
(5)语言处理能力强。
(6)C语言是一种结构化的语言。
C语言也有其不足之处:
(1)、主要表现为C语言对语法检查不严格。
(2)、C语言的运算符较多,初学者很难掌握其运算的优先级与结合性。
二、第一个C语言程序
1、代码
#include <stdio.h>
int main()
{
printf("初始C语言\n"); //当然printf里面输出的文字可以写成"hello world\n"
return 0;
}
运行结果:
2、关于代码的解释
(1)、#include <stdio.h>:编译预处理命令,集成开发环境在编译C语言程序前要对其进行解释,stdio.h这是C语言提供库函数所在的头文件(stdio.h),我们想要使用C语言提供的库函数,就必须在程序首行包含这个库函数所在的头文件。
(2)、main函数是程序的入口,main函数在一个C语言程序中有且只有一个,因为main函数相当于一个门,一个人走两个门是不可以的吧,除非你有分身。
(3)、printf ():这是C语言为我们提供的库函数,而这个库函数是在stdio.h这个头文件里面的,所以我们要想使用这个库函数,就必须在程序中包含头文件,否则会编译失败。
三、数据类型
1、C语言中的数据类型
C语言的数据类型包括:char 字符型数据类型、short短整型、int 整型、long 长整型、long long更长的整型、float 单精度浮点数、double 双精度浮点数。
2、对数据类型提出的问题
(1)、他们分别占用内存空间的大小是多大?
这里用sizeof运算符进行验证,这里到后期会详细解释sizeof的用法,上代码!
#include <stdio.h>
int main()
{
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;
}
运行结果
那么这些数字的单位是什么呢?要了解这个请看下一个问题!
(2)、运行结果的数字代表了什么,单位是什么?
要解答这个这个问题,首先要了解计算机单位
1B(Byte 字节)=8bit,
1KB (Kilobyte 千字节)=1024B,
1MB (Megabyte 兆字节 简称“兆”)=1024KB,
1GB (Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB (Trillionbyte 万亿字节 太字节)=1024GB,其中1024=2^10 ( 2 的10次方),
1PB(Petabyte 千万亿字节 拍字节)=1024TB,
1EB(Exabyte 百亿亿字节 艾字节)=1024PB,
1ZB (Zettabyte 十万亿亿字节 泽字节)= 1024 EB,
1YB (Yottabyte 一亿亿亿字节 尧字节)= 1024 ZB,
1BB (Brontobyte 一千亿亿亿字节)= 1024 YB.
那么我们这里的单位是什么呢,答案是B (字节),以上程序的运行结果就说明了,一个char类型数据所占内存空间的大小为1字节,short为2、int为4字节、long为4字节、long long 为8字节、float为4字节、double为8字节。
3、类型的使用
#include<stdio.h>
int main()
{
char a ='a';
int b = 10;
float c = 10.2;
return 0;
}
四、变量和常量
1、变量
(1)、什么是变量?
生活中有很多的数据是可变的,比如年龄,体重,薪资这些量都是变化的量,也相当于数学里函数的变量。总之就是可变的
(2)、定义变量的方法
数据类型 变量名 = 初始化变量;
int age = 10;
float weight = 45.5f;
char ch = 'w';
(3)变量的命名
只能由字母(包括大写和小写)、数字和下划线( _ )组成。
不能以数字开头。
长度不能超过63个字符。
变量名中区分大小写的。
变量名不能使用关键字。
(4)变量的分类
变量可以分为局部变量和全局变量,上代码!
注意一个问题,当全局变量和局部变量名相同的时候,局部变量优先使用
#include<stdio.h>
int num = 10;
int main()
{
int num = 1;
printf("%d\n", num);
return 0;
}
运行结果:
(5)变量的使用
这里举一个程序的例子
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
运行结果为:
(6)、变量的生命周期和作用域
作用域 作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用 的而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个工程。
生命周期 变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的生命周期。
2、常量
(1)、常量的概述
C语言中的常量和变量的定义形式会有所差异,C语言中常量可以分为以下几种类型
字面常量、const修饰的常变量、#define定义的标识符常量、枚举常量。
(2)、常量的详细讲解
第一个:字面常量,比如说人的性别、一个数字等等都是字面常量
int main()
{
3.14;//一个数字的常量
"男"; //人的性别的常量
return 0;
}
第二个 :const 修饰的常变量
在const修饰的变量中需要注意的是,即使是用const修饰的常变量,这个常变量也不能指定数组的长度。但是在支持c99标准的编译器里是可以去用它来指定数组长度的,比如linux系统下的gcc编译器。
vs2022环境下
第三个:#define修饰的常量,它可以指定数组元素的大小,定义形式如下
#define MAX 10
一般情况下我们把这个定义语句放在程序的顶端
#define MAX 10
#include<stdio.h>
int main()
{
int arr[MAX] = { 0 }; //使用#define修饰的常量对数组元素的个数进行指定
return 0;
}
第四个枚举类型:枚举类型C语言中的一个类型,它里面所包含的所有常量成为枚举常量
五、字符串、转移字符、注释
1、字符串
"hello world.\n"
这种有双引号引起来的一串字符称为字符串字面值,或者简称字符串。注意:字符串的结束标志是一个 '\0' 的转义字符。在计算字符串长度的时候'\0' 是结束标志,不算作字符串内容
看代码:
#include<stdio.h>
#include<string.h>
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
char arr1[] = "bit";
char arr2[] = { 'b', 'i', 't' };
char arr3[] = { 'b', 'i', 't', '\0' }; //'\0'为字符串的结束标志
printf("%s\n", arr1); //bit
printf("%s\n", arr2); //bit 烫烫烫烫烫
printf("%s\n", arr3); //bit
printf("%d\n", strlen(arr1)); //3
printf("%d\n", strlen(arr2)); //随机值
printf("%d\n", strlen(arr3)); //3 ,arr3中的字符串长度为3,表明'\0'是一个结束标志,不算做字符串的长度。
//strlen 是一个用来计算字符串长度的函数,头文件为<string.h>
return 0;
}
运行结果:
那么第二行为什么会出现乱码,而且为什么35是一个随机值,这需要通过内存来进行说明
以下是有’\0‘和没有'\0'的内存图:
第一个有\0而第二个没有,由于strlen()函数是以\0为结束标志求字符串长度的而第二个没有\0那么这里会发生数组的越界访问,就会输出随机值,同样也就会发生乱码,为了避免出现这种错误,我们在定义字符类型数组,用它来进行字符串的存储时,必须在后面加上\0。
2、转义字符
转义字符
|
释义
|
\?
|
在书写连续多个问号时使用,防止他们被解析成三字母词
|
\'
|
用于表示字符常量
'
|
\“
|
用于表示一个字符串内部的双引号
|
\\
|
用于表示一个反斜杠,防止它被解释为一个转义序列符
|
\a
|
警告字符,蜂鸣
|
\b
|
退格符
|
\f
|
进纸符
|
\n
|
换行
|
\r
|
回车
|
\t
|
水平制表符
|
\v
| 垂直制表符 |
\ddd |
ddd
表示
1~3
个八进制的数字。 如:
\130 X
|
\xdd
|
dd
表示
2
个十六进制数字。 如:
\x30 0
|
转义字符的使用:这里要说明\ddd、\xdd 的使用
看代码
这里涉及到十进制、十六进制和八进制数之间的互相转换,可以去《计算机导论》去学习转换方法。
其他转义字符举例,
int main()
{
printf("%d\n", strlen("abcdef"));
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
这个程序的运行结果,由于8不是八进制数所以它算一个字符,而\62 表示一个八进制的转义字符。结果为:6 14。
3、注释
结语:会持续更新C语言的知识,请大家点点赞(觉得有用再点)。