一、C语言是什么?
C语言是一门计算机语言,是人与计算机进行交流的一种语言。通过计算机语言编写程序,下达指令给计算机,就可以让计算机工作。目前已经有上千种计算机语言,C语⾔只是众多计算机语言中的一种。
在编程界中有C生万物之称,它学习曲线低,易上手,却广泛应用于底层开发,可以让学习者更好理解计算机工作的底层原理。是初学者首学编程语言的不二之选。
二、开发环境
1.编译器
这里笔者使用的是vs2022和dev-C++,二者都是集成开发环境。
其中vs2022对代码要求更加严格一些,并且会指出运行中出现的相关问题,还会对代码进行缩进,有助于初学者养成良好的代码风格。
dev-C++则更加小巧轻便,多用于学校教学和竞赛中。
三、初始C语言
1.第一个C语言程序
这里以vs2022为例,首先创建一个空项目,下一步
选择源文件,添加新建项
选择第一个C++文件,注意编写C语言程序的时候要把名称一栏改为以".c"结尾,C++文件时则是以".cpp"结尾。
下面是代码
#include <stdio.h> //这一行是头文件,在文中作用是对函数 printf 的声明,以便调用文件中使用的库函数 printf
//当然还有一些列库函数,调用库函数也要引用不同的头文件进行声明
int main() //这一行成为主函数,是每个程序的入口,每个文件只能有一个main函数
{
printf("hello world");//这一行是使用库函数printf进行一个输出,在屏幕上打印出 hello world
return 0; //这一行是程序的正常返回,也是本程序的结束
}
下面是运行结果
这就是我们C语言的第一个程序,让我们知道代码是可以这么运行的,可能还会有不理解的地方,不过别担心,后文会一一提及
2.数据类型
- char // 字符数据类型 // 键盘上所有能敲上的都是字符
- short // 短整型 // 就是数字小(绝对值)的整数
- int // 整型 // 就是整数
- long // 长整型 // 就是数字(绝对值)大的整数
- long long // 更长的整型
- float // 单精度浮点数 // 就是小数
- double // 双精度浮点数 // 小数位数多的小数
2.1 为什么要有这么多数据类型
因为生活中要用到不同的数据,整数,小数。同时不同数据类型在内存中所占大小是不一样的,如果都用同一数据类类,难免造成空间的浪费,所以人们规定了不同的数据类型,以便空间被物尽其用。
2.2 数据类型的长度
其中标准C中规定long的大小等于int,在不同编译器上long的大小可能为4,也可能为8。
其中sizeof是一个操作符,可以计算数据类型的大小。
3. 变量 && 常量
变量和常量可以用来存储变化和不变的东西
如不变的(比如:圆周率,性别,身份证号码,血型等等)
可变的(比如:年龄,体重,薪资)。
3.1 如何定义变量
数据类型+自定义变量名+赋值
3.2 变量的分类
局部变量--全局变量在整个文件内都可使用
全局变量--在自身所在代码块(花括号)内才可使用
#include<stdio.h>
int global = 2019;//全局变量
int main()
{
int local = 2018;//局部变量
int global = 2020;//局部变量
printf("global=%d\n", global);//当局部变量和全局变量相冲突的时候结果如何
return 0;
}
冲突时答案是局部变量优先 ,局部变量将会覆盖掉全局变量
3.3 变量的使用
3.4 变量的作用域和生命周期
3.4.1
作用域是程序设计的一个概念,一段代码中所用到的概念并不总是有效的
而限定这个名字可用性的代码就是这个名字的作用域
其中局部变量的作用域是局部变量所在的范围
而全局变量的作用域是整个工程
3.4.2
变量的生命周期是指变量的创建到变量的开始这一时间段
局部变量的生命周期是:从进入作用域开始到出作用域结束
全局变量的生命周期是:整个程序的生命周期
3.5 常量
常量分为以下四种
3.5.1 字面常量
如数值常量: 10 20 -1.23
如字符常量: 'a' '1'
如字符串常量: "hello" "world"
布尔常量:表示真(true)假(false)的值
3.5.2 const修饰的常变量
用const修饰变量,如const int
将变量赋予静态特性,使它的生命周期变成整个程序,但其本质还是变量,只是被赋予了常属性
3.5.3 #define定义的标识符常量
#define MAX 100
#include<stdio.h>
int main()
{
printf("%d",max);
return 0;
}
使用预处理指令define,用MAX替换了100,以后每次使用MAX即可代表100。
3.5.4 枚举常量
以下是使用形式
enum DAY
{
MON = 0, TUE, WED, THU, FRI, SAT, SUN
};
枚举常量中的每个变量的大小都会依次增加1,在一些场合较为适用,避免了过多的代码编写
4.字符串 && 转义字符&&注释
4.1 字符串
有双引号引起来的一串字符称为字符串
- 注:字符串的结束标志是一个\0的转义字符。在计算字符串长度时\0只是结束标志,不算做字符串内容。
4.2 转义字符
什么是转义字符:通俗来讲,转义字符就是加上\的字符和字符单独出现时所代表的意义不一样。
- 下面展示一些常见转义字符
- \? 在书写连续多个问号时使用,防止他们被解析成三字母词
- \’ 用于表示字符常量’
- \" 用于表示一个字符产内部的双引号
- \\ 用于表示一个反斜杠,防止它被解释为一个转义序列符
- \a 警告字符,蜂鸣
- \b 退格符
- \f 进纸符
- \n 换行
- \r 回车
- \t 水平制表符
- \v 垂直制表符
- \ddd ddd 表示1~3个八进制的数字。如:\130X
- \xdd dd 表示2个十六进制数字。如:\x30 0
所以在输出的时候要注意转义字符被解释成相关含义,而无法正常输出 。
4.3 注释
代码中不需要的代码可以直接删除掉,也可以注释掉(对程序没有任何影响)
代码中难懂的地方,可以加一些注释解释
注释的方法://+注释内容 或 /*注释内容*/
//这里就是注释
/*还有这里*/
5. 选择(判断)&&循环语句
5. 1 选择语句
5.1.1
如下代码,首先判断if后括号的内容,若为真则执行下代码块中执行内容
注:C语言中0为假,非0为真。
if (条件表达式){
// 条件满足
执行语句
}
// 用法
if (条件表达式){
// 条件满足
执行语句
}else{
// 条件不满足
执行语句
}
其中若if为假,则可执行else中的语句
if (条件表达式1){
// 满足条件表达式1
执行语句;
}else if (条件表达式2) {
// 满足条件表达式2
执行语句;
}else if (条件表达式3) {
// 满足条件表达式3
执行语句;
}
...
else if (条件表达式n) {
// 满足条件表达式n
要执行的语句;
}else{
// 所有条件表达式都不满足
要执行的语句;
}
当然也可以多次判断,若满足则进入对应语句中,若不满足则执行最后一个else语句
5.1.2 switch语句
switch语句:
```c
switch(表达式)
{
case 常量a:
// 如果表达式的值等于常量a,执行下面的语句1
语句1 ;
break;(跳出语句)
case 常量b:
// 如果表达式的值等于常量b,执行下面的语句2
语句2;
break;
...
case 常量n:
// 如果表达式的值等于常量n,执行下面的语句n
语句n;
break;
default:
// 默认执行的语句,如果没有通过上面的开关语句退出,就会执行下面的语句n+1
语句n+1;
// 使用default可以省略break;因为它本身就是最后执行,执行完就会退出开关语句。
}
5.2 循环
1. while循环
初始化;
while(条件)
{
执行和调整语句;
}
while循环只要判断条件为真,就可以执行语句,然后再次判断,在次执行,直到判断为假。
2. for循环
结构:
for (初始化1;判断2;调整3)
{
语句;
}
循环逻辑:
step1:先执行表达式1
step2:然后执行表达式2,
step3:如果step2结果为真,执行语句,否则退出循环
step4:如果step3没有退出循环,则循环至满足条件二时跳出循环
for循环可以先初始化数据,然后判断真假,若为真即可以执行语句,再进行数据的调整,判断调整后的数据是否为真,若为真即可再次执行语句,直至判断为假。
3.do...while语句
do
{ 执行和调整语句;}
while(条件)
这个循环很有意思,和while循环类似,不过它会先执行一次语句,然后进行判断真假,也就是说,它的语句至少执行一次。
6. 函数
编程中的函数不同于数学的函数,如何理解它呢,可以把它当作一个计算器,你输入一些数据,他就会给你返回计算后的数据。
函数分为库函数和自定义函数。
库函数:是指编译厂商已经写好了的函数,包含头文件后可以直接使用的,如printf,scanf。
自定义函数:指的是由自己编译的函数,类型,功能和返回值都由自己设置。
在编码过程中,难免遇到重复使用某组语句,这时候创建一个函数能使编码简便快捷许多–简化重复使用。
如下展示一个加法的自定义函数
int Add(int x, int y)//函数的定义 数据类型+函数名+函数参数 注:定义函数时的参数为形参
{
int z = 0;
z = x + y; //这里是函数的功能
return z; //这里是函数的返回值
}//
int main()
{
int a = 10;
int b = 20;
int ret = 0;
ret = Add(a,b); //函数的调用 调用时函数的参数为实参
printf("%d\n", ret)
return 0;
7. 数组
7.1 数组的定义
数组定义:一组相同类型的集合
语法:类型+数组名[长度];
数组引用:
数组的引用要调用下标,而下标都是从0开始的。
如下的一维数组,想要调用数字3,即可使用a[2],其中[ ]是操作符,2则是下标。
int a[10]={1,2,3,4,5,6,7,8,9,10};
8. 操作符
操作符有如下种类
再此单独介绍几个现阶段的,未讲解的会在后文提及
其中'%'是数学的模,比如7%3的结果是1,另外此运算符只适用于整数
赋值运算符可以举几个例子,看下代码
a=2;a+=3和a=a+3等价,结果a等于5;
a=2;a *=3和a=a*3等价,结果a等于6;
其他的是一样的道理。
!:可以放在变量常量之前,如条件判断时,!0即为真。
&:可以配合scanf使用,是要在变量名前加上&,&+变量的意思是取变量a的地址,这是&符号的作用之一。
逻辑操作符可用作条件判断
&&:如a&&b,只有a和b同为真,整体才为真。
||:如a||b,只要a和b其中一方为真,即为真。
接下来讲一下条件操作符,它和判断语句有些类似,它的逻辑是
表达上1?表达式2;表达式3
首先判断表达式1的真假,若为真,则执行表达式2,否则执行表达式3。
逗号表达式是 C 语言中的一种运算符,它使用逗号将两个或多个表达式连接在一起形成一个新的表达式。(本质上还是一种运算)
详情见下
int main()
{
int x, y;
x = (5, 3, 8);//5,3可直接忽略,最后会将9赋给x;
y = (x++, x + 2, x * 2);
//等价于
int x, y;
x = 8;
y = (x++, x + 2, x * 2);
//y的最后结果为16
//1.x++等价于x=x+1,所以这一步x变为9;
//2.x+2 执行结果为11,但并没有进行赋值操作,所以x还是为9;
//3.执行y=x*2;对于逗号表达式来说,只有最后一个子表达式才有赋值的操作
return 0;
}
int main()
{
int arr[] = { 1,2,(3,4),5 };
printf("%d\n", sizeof(arr));//输出结果是16
return 0; //(3,4)是逗号表达式,从左向右执行,等价于4
//也即等价于arr[]={1,2,4,5};
}
9. 常见关键字
在此介绍几个常见的关键字
1. break
关键字break在switch和循环语句中使用的较多,它的作用是调出该层的循环,终止该语句。
2. continue
它常用于循环语句中。它的作用是当符合条件时,continue后面的语句不再执行,跳出本次循环,再开始下一次循环。
3. typedef
typedef可以理解成类型重命名 比如:
//将unsigned int 重命名为uint,uint就也是一个类型名
typedef unsigned int uint;
int main()
{
unsigned int num1 = 0;
uint num2 = 0; //这里num1 和num2的类型是一样的
return 0;
}
可以化繁琐类型为简单。
4. static
在C语言中,static是用来修饰变量和函数的
1. 修饰局部变量-静态局部变量
将局部变量赋予常属性
#include <stdio.h>
void test()
{ int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
可见上一段代码,由于i是局部变量,生命周期在对应函数内,出作用域后销毁,所以i走出函数后的值恒为0。
而下方代码用 static修饰,将局部变量赋予了静态属性,即使它的生命周期变成整个函数。
#include <stdio.h>
void test()
{
//static修饰局部变量 static int i = 0;
i++;
printf("%d ", i);}
int main()
{
int i = 0;
for(i=0; i<10; i++)
{
test();
}
return 0;
}
注:以.c结尾的是源文件,而以.h结尾的是头文件,一个工程里可以有多个文件。
2. 修饰全局变量-静态全局变量
一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,
不能在其他源文件内使用。
3. 修饰函数-静态函数
一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
10. define定义常量和宏
define定义常量在上3.5.3提及
以下是define定义宏,类似函数,用define把函数名和函数体替换,实现如下,更详细内容后文会提及,先了解。
#define ADD(x, y) ((x)+(y))
int main()
{
int sum = ADD(2, 3);
printf("sum = %d\n", sum);
sum = 10*ADD(2, 3);
printf("sum = %d\n", sum);
return 0;
}
11. 指针
指针也被称为C语言的灵魂,后续会详细讲。
12. 结构体
自定义类型的结构体,枚举,联合后文也会开单章,可以转移目光到下篇博客。
四、 总结
先初步了解C语言是什么,C语言的大体语法如何,有助于我们后续专项的学习,做到有的放矢,后续博客也会把知识和场景结合起来,加深记忆。
最后笔者也是初入大一,我们的梦想一起从C语言启航吧