章节目录
人与人之间沟通,使用的语言分为汉语,英语,日语等一系列语言,而C语言则是人与电脑之间沟通协作所使用的高级编程语言中的一种。
第一个C语言程序
例如下述代码,就是告诉电脑在屏幕上输出 Hello world!
#include <stdio.h>//包含头文件
int main()//主函数
{
printf("Hello World!");//输出字符串
return 0;
}
数据类型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点型
double //双精度浮点型
注意:这里的单双精度浮点型是指小数位后显示精度,单精度浮点型在使用时显示小数点位后值少导致精度丢失,所以称为单精度,双精度则是精度高称为双精度
(1)在内存中占有的字节数不同
•单精度浮点数在机内占4个字节
•双精度浮点数在机内占8个字节
(2)有效数字位数不同
•单精度浮点数有效数字8位
•双精度浮点数有效数字16位
(3)所能表示数的范围不同
•单精度浮点的表示范围:-3.40E+38 ~ +3.40E+38
•双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308
(4)在程序中处理速度不同 一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快
在一个固定大小的盒子中,我们一般放入的东西都是刚好契合它的大小,如果放不下,我们就会更换一个适合他大小的盒子,数据类型也是同理,不同的数据类型大小也是不一样的,为了更灵活的使用有限的内存,也是为了更丰富表达生活中的各种值,所以衍生出了这么多不同的数据类型
#define _CRT_SECURE_NO_WARNINGS 1
#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(double));
printf("%d \n", sizeof(long double));//多精度浮点类型或长精度浮点类型
return 0;
}
变量&常量
变量(variabal),也称之为对象。可以理解为存放数据的魔法盒子
定义变量的方法
#include <stdio.h>
int main()
{
int a;
a = 10;//1. 明一个名称为"a"的整型变量 2. 对变量a进行赋值
int b = 10;//1. 声明一个名称为"b"的整型变量并进行初始化
int c;//1. 声明一个名称为"c"的整型变量。
return 0;
}
初始化的区别
int a; a = 10;
先声明之后再将变量内放入一个指定数值,称之为赋值。int b = 10;
声明的同时放入一个指定的值,称之为初始化int c;
创建了一个变量,但并没有对变量进行赋值。但变量内还是会产生数值,这种值称之为"随机值"
赋值:声明变量后放入数值
初始化:声明变量的同时放入数值
随机值:声明变量不对其进行赋值或初始化
所以我们在C语言中,创建变量时务必在创建时进行初始化~
变量的分类
- 全局变量
- 局部变量
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int age = 2022;//全局变量
int main()
{
int age = 2023;//局部变量
printf("age=%d\n", age);
return 0;
}
总结:
- 变量age的创建是没有任何问题的,因为一个是全局变量,一个是局部变量(名字可以相同)
- 名字相同的情况下,局部变量是优先使用的
变量的命名规则
1. 只能由字母(包括大写和小写)、数字和下划线( _ )组成。
2. 不能以数字开头。
3. 长度不能超过63个字符。
4. 变量名中区分大小写的。
5. 变量名不能使用关键字。
常量
如同上面描述变量,常量即是不可变化的量。是一些固定的值,它在整个程序运行过程中无法被改变。
也是分为几种类型
1.字面常量
2.const修饰的常变量
3. #define定义的标示符常量
4.枚举常量
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define Pi 3.141592
enum Sex
{
MAN,
MALE,
FAMALE
};//括号中的即是枚举常量
int main()
{
15.067;//字面常量
2.569;//字面常量
//const修饰的常变量
const int sum = 10;//sum内的值不可修改
const int num = 20;//num内的值不可以更改
//枚举常量是从0开始,向下依次+1递增的
printf("%d\n", MAN);
printf("%d\n", MALE);
printf("%d\n", FAMALE);
//#define定义的标识符常量
printf("%lf\n", Pi);
return 0;
}
如上述代码,在C语言中使用并且创建常量通常为以上几种方法
- const修饰的常量,称为常变量,本质上还是变量,拥有了常量不可变的属性。
- #define修饰的标识符常量,意思为在这个工程内,num替代了10。 注意,这里不要理解为num=10
这就相当于你大名叫李四,但你朋友叫你外号小四,你也知道在叫你。
变量的使用
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int sum = 0;
int num = 0;
scanf("%d%d", &sum, &num);//格式化输入函数
int swag = sum + num;
printf("%d\n", swag);//格式化输出函数
return 0;
}
我们可以在变量中放入任意int型数据进行操作,例如相加,相乘,相除等一系列。
作用域和生命周期
作用域
作用域(scope)是程序设计概念,通常来说,一段代码中所用的名字并不总是有效/可用的
而限定这个名字可用性的代码范围就是这个名字的作用域
1. 局部变量的作用域即是变量所在的局部范围
2. 全局变量的作用域是整个工程
生命周期
变量的生命周期是指变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域,生命周期结束
2. 全局变量的生命周期是:整个程序的生命周期
字符串和转义字符
字符串
“Hello Word\n”
在C语言中,这种由双引号(Double Quote)引起来的一串字符称之为字符串字面值(String Literal),或简称字符串。
而字符串后结尾是由\0
来结束的,可以理解为一段话短句由句号断尾。这个\0
就是字符串的结束标志,不属于字符串内容
语言描述还是不能让大家有一个清晰的认知,我们下边可以来看一段代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr[] = "Hello";
char arr1[] = { 'H','e','l','l','o' };
char arr2[] = { 'H','e','l','l','o','\0' };
printf("%s\n", arr);
printf("%s\n", arr1);
printf("%s\n", arr2);
return 0;
}
可以看到,如果字符串内没有结束标志\0
,那么打印完我们想要打印的东西后,会继续将内存中后续的东西持续打印,直到找到\0
为止,并且\0
的位置不是固定的,大家可以将上述代码拷贝到自己的vs内运行查看结果,会发现每次arr1打印出的结果都不同,如下图,我们根本不知道HELLO后边要多长才能找到\0
,可能这次正常打印,也可能要打印很久才能找到\0
转义字符
在上述的举例代码中,可以看到经常出现的一个字符\n
,这就是转义字符,它的作用是打印后自动换一行。
那么我们接下来来打印一个文件目录,例如\node\code.c,将这个目录打印出来,我们来看一下会出现什么效果
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("\node\code.c\n");
return 0;
}
可以看到,打印出来的结果跟我们想要的效果根本没有半毛钱关系,这就是因为在C语言中的转义字符造成的,我们先来看下面这张转义字符表
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\’ | 用于表示字符常量’ |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止他被解析成转义字符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字,如\130 X |
\xdd | dd表示两个16进制数字。如\X 30 0 |
所以说,在上述代码中,我们的编译器将\n识别为了换行转义字符,而\同样识别为了转义字符,故没有打印出来。接下来我们实践一下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("\'%s\'\n","Hello Word");
printf("%s\n", "Hello Word");
printf("%s\n", "Hello Word");
printf("\"%s\"\n", "Hello Word");
return 0;
}
注释
- 代码中有些不需要的代码可以直接删除,也可以选择不删除而注释掉
- 代码中 ,我们可以对部分难以理解的代码加些注释,方便以后阅读和其他人阅读理解
注释风格
/*这是C语言的注释风格,使用/*分别加在需要注释内容的头部与尾部
int main()
{
int a = 0;
return 0;
}
缺陷:不能嵌套使用*/
//这是C++的注释风格,使用两个双斜杠加在需要注释的头部
//可以注释一行,也可以注释多行
int main()
{
int a = 0;//创建了一个变量
//priantf("%d",a);
return 0;
}
选择语句
在人生的道路上,我们会面临许多选择。在购物的过程中,对于需要的商品我们同样面临选择,那么在程序中也是同理
ifelse语句
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int y = 0;
printf("好好学习(请输入1)/彻底摆烂(请输入0)\n");
scanf("%d", &y);
if (y != 0)//对y进行判断,如果值为真(非0),则判断成立,执行语句
{
printf("年入百万,人生赢家\n");
}
else//若结果为假,则执行这条语句
{
printf("惶惶不可终日\n");
}
return 0;
}
ifelse语句,通过对表达式结果的判断,来判别执行具体那条语句。上述代码,如果满足条件y不等于0,则为真,执行printf("年入百万,人生赢家\n");
这条语句,而如果判断结果为假,也就是y!=0
不成立,则执行 printf("惶惶不可终日\n");这条语句。
循环语句
有些事情,是我们日复一日都在重复所作的事情,直到满足条件后,我们可能就不再做了,例如每天上班,突然有一天,我收到麻匪送来的银子暴富了,我不去上班了,我开摆了,我躺平了。这就是循环语句
那么C语言中是有那些循环语句呢
- while循环
- for循环
- dowhile循环
下边我们来看几组示例代码
while循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int money = 0;
printf("出城剿匪\n");
while (money < 180000)//循环条件
{
money++;//循环体
printf("剿匪失败\n");
}
if (money==180000)//满足条件,跳出循环
{
printf("剿匪凯旋");
}
return 0;
}
for循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int money = 0;
printf("买县长\n");
for (money = 0; money < 500000; money++)//循环体
{
printf("没买到\n");
}
if (money==500000)
{
printf("上任康城\n");
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int money = 1800000;
do
{
printf("%d\n", money);//循环体
} while (money--);
return 0;
}
可以看到,循环的几个条件
- 与选择语句相同,进入循环与跳出循环,首先需要条件
- 一个循环要有循环体,不然就死循环了(没钱怎么剿匪,没钱怎么上任康城)
- 循环是可以嵌套使用的
函数
C语言中的函数与数学中的函数不可以做相同的理解,C语言中的函数可以理解为一个工具箱
在上述代码中,我们举例了两个变量相加的代码是如何实现的,那么如果我们每次要使两个操作数相加如果都使用相同方法书写代码,那么整个代码看起来会很臃肿,重复单一的操作过多 ,这时候,函数就出现了。我们首先看一组代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Add(int a, int b)//int是返回类型,Add是函数名,a,b是形参,用来接收传入函数的数据
{
return a + b;
}//函数必须声明在主函数的外部
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
int sum = Add(a, b);//sum用来接收函数Add返回值
printf("他们的和是%d", sum);
return 0;
}
可以看到,在上述代码中,我们求a,b之和的方式要比之前简洁许多,并且在下次使用时也不需要重新编写一段长代码
总结:函数的特点就是简化代码,代码复用
数组
我们现在已经了解了整形变量是可以存储数字的。那么如果想一次性存入多个数字,该怎么存放呢,又能否存在变量内呢
数组的定义
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
return 0;
}
数组:可以将多个相同类型的元素存放在一起,通过下标来访问(图中A处)。如果数组元素是十个,那么下标即是0-9
数组的使用
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i < 10; i++)
{
printf("%d", arr[i]);
}
return 0;
}//通过循环打印出下标0-9内的各个元素
关键字
ANSI C标准 C语言共有32个 关键字 ,9种 控制语句 ,程序书写形式自由,区分大小写。 把 高级语言 的基本结构和语句与低级语言的实用性结合起来。 C 语言可以像 汇编语言 一样对位、 字节 和地址进行操作,而这三者是计算机最基本的工作单元。
常见关键字
关键字typedef
此关键字作用是将关键字重新命名,也就可以理解为起小名,看示例代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
typedef long long ll;
int main()
{
ll i = 1000000000;
long long a = 2000000000;
printf("%lld\n", i);
printf("%lld\n", a);
return 0;
}
关键字static
在C语言程序中:
static是用来修饰变量和函数的
- 修饰局部变量-称之为静态局部变量
- 修饰全局变量-称之为静态全局变量
- 修饰函数-称之为静态函数
//示例代码1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
int j = 0;
for (j = 0; j < 10; j++)
{
test();
}
return 0;
}
//示例代码2
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void test()
{
static int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
int j = 0;
for (j = 0; j < 10; j++)
{
test();
}
return 0;
}
static修饰的局部变量延长了本身的生命周期,让局部变量生命周期延长至整个工程结束
static修饰局部变量时,改变了局部变量的存储类型,普通的局部变量是存放在栈区,但被static修饰的静态局部变量被存放在了静态区。存储在静态区的变量,出了作用域不会被销毁,依然存在所以静态变量的生命周期就是程序的生命周期,程序结束的时候,静态变量才被回收空间
生命周期:变长
作用域:不变
static修饰全局变量
- 全局变量具有外部链接性
- static修饰全局变量时,这个外部链接属性就变成了内部链接属性
- 这个全局变量整个工程内只有在自己所在的.c文件可以使用,其他的文件不可以使用
static修饰函数
被static修饰的函数同样如此。
欢迎大家的阅读,如果觉得本篇文章不错就麻烦给作者点个赞吧,如果哪里不够清晰也请各位留言帮忙指正哦。你的鼓励就是我最大的动力!Fighting!