前言
提问:什么是c语言?吃语言,菜语言?
不不不,饿了就去饭堂哈。
C语言是一门面向过程的计算机编程语言。
与C++、Java等面向对象编程语言有所不同,C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%-20%。因此,C语言可以编写系统软件。
简单的说:C语言会让你变秃,变秃会让你变强。
接下来就让我们进入C语言的世界吧!
文章目录
一、写c语言代码的第一步是什么?
编程之路:
有同学说,c语言嘛
这不就是先来个预处理#include <stdio.h>
?
不不不,是先下载写代码的软件。这里推荐使用vs2019。
下面是下载链接:
点我去下载呗 Visual Studio 2019 IDE 下载
然后就是打代码啦!
#include<stdio.h>
//主函数
//stdio--标准输入输出
int main()
{
printf("hello world!");//printf--打印函数
return 0;
}
解释:
//main函数是程序的入口
//一个工程中main函数有且仅有一个
该来的还是要来的,每个学c语言的人都会看见的第一个代码 hello world!
![](https://i-blog.csdnimg.cn/blog_migrate/9e612af90e26d878688ffc7572134691.jpeg)
二、c语言入门
什么是入门?
所以想要学习好C语言,首先要大概了解一下C语言中的点点滴滴。就好像你想追一个女生你也会先去了解她,然后再去追不是吗?那么接下来就让我们进入C语言(入门篇)吧!
1.数据类型
字符 | 字符类型 |
---|---|
char | 字符数据类型 |
short | 短整型 |
int | 整型 |
long | 长整型 |
long long | 更长的整型 |
float | 单精度浮点数 |
double | 双精度浮点型 |
那么啥是数据类型呢,简单的说就是把数据分成所需内存大小不同的数据。在声明变量时也可指定它的数据类型分出数据类型。所有变量都具有数据类型,以决定能够存储哪种数据。
这里先说一下计算机中的单位
![](https://i-blog.csdnimg.cn/blog_migrate/39f59a0bd83c7dcd8d775811bb3d9d98.png)
我们存储东西的时候需要空间吧,那么在代码的世界了也是需要的,比如我需要存储一个数字,那么我就需要一些内存去存储他。然后呢就需要向内存申请内存,比如我要存储一个10,那么我就可以用int去申请内存存储他。这几个类型都是以字节为单位,比如 int 类型就会占用4个字节。存在这么多的类型,其实是为了更加丰富的表达生活中的各种值。
那么这些数据类型又分别是什么呢?
我们来看一下:
#include <stdio.h>
int main()
{
printf("The size of short is %d bytes.\n",sizeof(short));
//short就是存储整形但是是短一点的整形,那为什么要用这个呢
//因为内存空间有限,不需要那么多就不要申请那么多啦
printf("The size of int is %d bytes.\n",sizeof(int));
//这个就是整形哦,就是存储整数。
printf("The size of long is %d bytes.\n",sizeof(long));
//长整形,就是要存更大的整数的时候用。
printf("The size of float is %f bytes.\n",sizeof(float));
//浮点型,就是存储带小数的数。
printf("The size of double is %lf bytes.\n",sizeof(double));
//双精度,就是存储带小数的数但比上面那货精确位数更多。
printf("The size of char %c bytes.\n",sizeof(char));
//这个就不一样啦,是存储字符的一个数据类型。
return 0;
注意:输出整形的时候用的是%d,但float类型的时候是%f,
double类型的时候是%lf。
}
2.变量
上面我们知道了数据类型,还有一点点代码。
现在该来认识变量啦。我们先来看一下这一段代码:
#include <stdio.h>
int main()
int c=111;
{
int c=222;
printf("%d",c);
return 0;
}
变量分为两类,局部变量和全局变量。想区分他们其实也不难,局部嘛就是一部分地方有用,而全局就是在那里都有用。
像上面的int c=111
就是定义一个变量c,注意他没在括号里面哦,所以他的活动范围就非常的大,是全局变量。而int c=222
被束缚在括号的牢笼里,就是局部变量啦。
即局部变量的作用域是变量所在的局部范围。 全局变量的作用域是整个工程。
那么问题来了,上面的c的值是多少呢?
是222!!
注意:当局部变量和全局变量同名的时候,局部变量优先使用。
tip:这样写的代码其实不太好也没必要,还是少写为妙。
3.常量
![](https://i-blog.csdnimg.cn/blog_migrate/5785dfbaf34ed9b6fdce1107d7df8a71.jpeg)
注意:一个变量不能被改变我们就说具有常属性 - 不能被改变的属性
C语言中的常量分为以下以下几种:
1.字面常量
2.const 修饰的常变量
3.#define 定义的标识符常量
4.枚举常量
我们还是在代码块里面看:
#include <stdio.h>
int main()
#define pai 100//#define的标识符常量
{
double a = pai;
520;//字面常量,就是一个字面上的量。
const int a=100;//const 修饰的常量,变成一个常变量,常变量不能改变。
a=200;//错误,常属性不能改。
}
枚举常量就是举列出来的常量:
#include <stdio.h>
//举例
enum book//枚举
{
MATH,
CHINESE,
ENGLISH
};
//括号中的MATH,CHINESE, ENGLISH是枚举常量.
4.字符串+转义字符+注释
1.字符串
前面我们说到了字符和char数据类型,那一连串的字符就是字符串了,如"are you ok?"
。像这样由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。需要注意的是,每一段字符串结束都会有一个结束标志“\0”,不然输出字符串会继续乱码下去。直到碰上一个乱码刚好是“\0”。
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/ed5ff3b46f8beb91948f2fc984fdfba5.png)
在这里,arr[ ]是一个数组,现在暂且把它看作一个可以存放多个字符的容器,图中arr1中输入的是字符串,会自带“\0”以结束。arr2将其分解为一个一个的字符输入,就没有自带了,如果需要就要像arr3一样自己输入一个。由此看出“\0”是多么重要。
那么一个转义字符“\0”就很重要了,那么其他转义字符呢?
2.转义字符
我们先来看一段代码:
#include <stdio.h>
int main()
{
printf("a:b\c\defg\n");
return 0;
}
在前面已经知道 printf("")是输出
这里的代码结果会是什么呢?会是 "a:b\c\defg\n" 吗?
我们来看一下:
很明显不是,这是因为c语言中存在转义字符,转义字符顾名思义就是转变意思。就比如其中的"\n",加上 \ 之后n就不是n了,而是换行的意味。
下面我们来看看常见的转义字符:
转义字符 | 作用释义 |
---|---|
? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
– | – |
’ | 用于表示字符常量’ |
" | 用于表示一个字符串内部的双引号 |
\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 |
\a | 蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1-3个八进制的数字 |
\xdd | dd表示2个十六进制的数字 |
这些转义字符大家可以自己去尝试一下,这里就不一一展示了。
3.注释
作用:
- 代码中有不需要的代码可以直接删除,也可以注释掉。
- 代码中有些代码比较难懂,可以加一下注释文字。
在vs2019中,如果你想注释掉你打的代码,你可以:
选中后你也可以使用快捷键:
注意:
c语言中有两种注释方式,第一种是"// “的单行注释。
另一种是” /* xxxxxxx(内容) */"的范围注释。
即一种是以 / * 开始、以 */ 结束的块注释(block comment);
另一种是以 // 开始、以换行符结束的单行注释(line comment)。
5.基础语句
在C语言中可以实现很多程序的运行,而运行这些程序不能仅仅靠输入输出,所以C语言提供了多种语句来实现这些程序结构。
1.选择语句
选择语句就是你选择什么就会对应一个结果。
if(条件),若条件成立,就执行。
像这样:
![](https://i-blog.csdnimg.cn/blog_migrate/60c3522afaac396d822833c9feb48675.png)
#include <stdio.h>
int main()
{
int x = 0;
printf("上了大学你会好好学习吗?\n");
printf("输入1代表会,输入0代表不行\n");
scanf("%d", & x);
if (x == 1)
{
printf("好好学习的你,毕业后会得到一份好工作!\n");
}
else
{
printf("你没有好好学习,毕业后回家种地吧!\n");
}
return 0;
}
输出结果:
这就是C语言中的 if 选择语句。
2.循环语句
![](https://i-blog.csdnimg.cn/blog_migrate/d11cdd2290591f3f719e7e9b9bf85877.png)
这个可以自己看看研究一下:
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
printf("上大学了\n");
srand((unsigned)time(NULL));
int n = rand();//生成随机数
printf("中彩票在第%d天\n", n);
printf("想成功要学习985天\n");//好好学习985天
if (n <985)
{
printf("中了1000万\n", n);
printf("迎娶白富美 走上人生巅峰\n");
}
else
{
int line = 0;
while (line <= 985)
{
line++;
printf("买彩票\n");
printf("没中\n");
printf("好好学习\n");
}
if (line >985)
{
printf("成为大神\n");
printf("迎娶白富美 走上人生巅峰\n");
}
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/f0ddfecd3043fc4f9fb9b1045702855d.png)
好嘞这个数字还是让我们好好学习,不要相信一夜暴富!
C语言中的循环语句有:
1.for循环
2.while循环
3.do while循环
1.这里先讲while循环:
假设你是一位梦想成为程序员的大学生
当你天天敲代码敲到足够多的时候,成为程序员:
//while循环的实例
#include <stdio.h>
int main()
{
printf("上大学\n");
int daima = 0;
while (daima <= 20000)
{
daima++;
printf("继续努力敲代码\n");
}
if (daima > 20000)
printf("成为聪明绝顶程序员\n");
return 0;
}
所谓while语句就是格式为while(表达式){循环体},括号里面为条件,先判断while语句()里面的条件是否符合,满足时执行{ }里面的循环体,并再次回到while()前先判断后执行直到while括号里面的条件不满足为止.(实际上是判断while()括号里面为真还是假) |
值得注意的是,while循环是先执行在判断!
像上面的while(daima<=20000)
就是当daima这个数值小于20000的时候,我就会运行下面的循环体,即将代码的数值+1,然后输出一个"继续努力敲代码"。然后继续循环。然后还加了一个我们上面说到的if语句,当while语句执行完成后跳出循环接到if语句,此时daima已经是20001了,所以输出了!
2.再讲for循环
直接上代码!!
#inlcude <stdio.h>
int main()
{
int n=0;
scanf_s("%d",&n);
int i = 0;
for (i = 0; i < n; i++)
{
printf("*");
}
printf("\n");
return 0;
}
运行结果:
这里的话是一个输入语句,输入一个数,然后就到我们的for循环啦,首先for循环的格式就是for(单次表达式;条件表达式;末尾循环体){中间循环体;}。
简单的说就是for(初始值;条件;循环①){ 循环体② },这里的例题就是:i=0,然后当i<n的时候,就先循环②,再循环①。
像这里,我是想打印多个 * 号的,所以我先让代码输入一个数字,然后for循环里面的初始值与输入值对比,然后我这里输入的是5,第一遍循环,i<n成立,先执行输出一个 * ,然后执行i++,再回到判断条件继续循环,注意,这里的i回去已经刷新为i=1了,然后慢慢加到5,就跳出循环,然后每一次都输出了一个 * ,最后有5个 * 号。
3.do…while循环
然后是do…while循环,这个呢与while循环类似。但是不一样的在于while循环是先判断一下是否满足条件的。但是do…while循环就不一样,他直接先来循环一次,再进行判断。
可以理解为while循环是开始就判断条件,而do…while循环是结尾再做判断,先斩后奏。先do了再说。
![](https://i-blog.csdnimg.cn/blog_migrate/56df808e427c850c54b65c1b31274da1.jpeg)
比较一下两个代码:
![](https://i-blog.csdnimg.cn/blog_migrate/ed72debae15e25c91a33c728295ef9f9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/816f305ac792ab4ded531a5c681de565.png)
注意:虽然这里他们的输出结果是一样的,但是他们的初始状态是不一样的,while循环是先判断num是否小于10,小于我就进入,然后执行循环体,再回到判断。而do while 就是管你三七二十一,直接先执行一波,再问你,诶,有没有小于10,小于我再回去继续噢。
这就是do while循环。
6.函数
来了来了,c语言中的函数来了,是不是还在烦高中的函数呢,放心,c语言中的函数也很难(bushi),那么c语言为什么要引进函数这个概念呢?函数的特点就是简化代码,代码复用。所以为了简化某些冗长的代码,就用到了函数。
像这样的:
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &a, &b);
sum = num1 + num2;
printf("sum = %d\n", sum);
return 0;
}
通过上面的学习,我们知道这是一个输入两个整数,然后让他们相加再输出的一个代码。那如果我需要计算很多个两个数相加,是不是要敲很多个这样的代码呢,是不是要定义很多个这样的变量呢?
那么我们就可以利用函数来解决这个问题:
#include <stdio.h>
int Add(int x, int y) 这里是定义一个相加的函数
{
int z = x+y; 表示如何相加
return z; 返回值
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入两个操作数:>");
scanf("%d %d", &num1, &num2); 正常操作
sum = Add(num1, num2); 调用函数
printf("sum = %d\n", sum);
return 0;
}
像这个代码,就是先定义一个函数,然后再引用,因为如果我们需要很多类似的运算,那么重复写就太冗余了,所以可以直接用函数去简化。
7.数组
当我们简化代码的时候,还可以考虑简化其他东西,如果我们需要10个数字,是不是要定义10个变量呢,当然也是可以的,但100个1000个呢,于是我们可以运用数组来进行代替。
数组的定义:一组相同类型元素的集合。
int main()
{
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;//太冗长了!!!
int arr[5] = { 1,2,3,4,5 };
//定义一个整形数组,里面最多存放5个元素
}
同样的,想要存放字符也一样可以:
int main()
{
char ch[5] = {'a','b','c','d','e'};
return 0;
}
而当我们想要像变量一样打印出来的时候:
int main()
{
int arr[5] = { 1,2,3,4,5 };
printf("%d\n", arr[0]);
printf("%d\n", arr[1]);
printf("%d\n", arr[2]);
printf("%d\n", arr[3]);
printf("%d\n", arr[4]);
printf("%d\n", arr[5]);
}
他的结果是:
这里就需要注意了,当我们定义数组并且想引用某一个数的时候,我们想要写的下标是你想要数组中第n个数的n-1,也就是说我需要arr[ ]中的第四个数,我输入的是arr[3],因为arr[5]代表的是这个数组,而不是其中某一个数。
8.操作符
操作符有很多种类:
![](https://i-blog.csdnimg.cn/blog_migrate/57ffc08fa7121d8a36a55512c371eb64.png)
这里先不叙述,到时候会专门写一篇关于操作符的文章。
9.常见关键字
auto:声明自动变量一般不使用
double:声明双精度变量或函数
int:声明整型变量或函数
struct:声明结构体变量或函数
break:跳出当前循环
else:条件语句否定分支(与if连用)
long:声明长整型变量或函数
switch:用于开关语句
case:开关语句分支
enum:声明枚举类型
register:声明积存器变量
typedef:用以给数据类型取别名(当然还有其他作用)
char:声明字符型变量或函数
extern:声明变量是在其他文件正声明(也可以看做是引用变量)
return:子程序返回语句(可以带参数,也看不带参数)
union:声明联合数据类型
const:声明只读变量
float:声明浮点型变量或函数
short:声明短整型变量或函数
unsigned:声明无符号类型变量或函数
continue:结束当前循环,开始下一轮循环
for:一种循环语句(可意会不可言传)
signed:生命有符号类型变量或函数
void:声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
default:开关语句中的“其他”分支
goto:无条件跳转语句
sizeof:计算数据类型长度
volatile:说明变量在程序执行中可被隐含地改变
do:循环语句的循环体
while:循环语句的循环条件
static:声明静态变量
这里也是草率的一笔带过,到时候会写一篇关于关键字的文章。
10.指针
c语言指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址。指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(pointsto)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
——所谓指针,就是把计算机内存变成小格子,每一个叫做内存单元。给每个内存编个号。把编号称为地址。每一个地址用多少内存合适,单位上的话bit太少了,byte比较合适。变量都会有地址。
打个比方:有个人让你去老王家帮他拿个被子,那么老王家是这个变量a,但是那个人现在把老王家所在的地址写在纸上给你,那么这张纸就可以看做一个指向老王家的指针。 |
比如:
int main()
{
int num = 10;
#//取出num的地址
printf("%p\n", &num);//打印地址,%p--以地址的形式打印
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6ee4c077e7719c6487a5bd6b6821b6c4.png)
这里显示的就是变量num的地址,这就是num所占的空间。那地址如何存储?这里就需要定义指针变量了。
#include <stdio.h>
int main()
{
int num = 10;
int *p = #
*p = 20;
return 0;
这里的 * 代表这个p是一个指针变量,而前面的int 代表p指向的对象
num是一个int类型的变量。
}
意思就是说我讲num这个变量的值10的存在内存中,这个内存的地址存到了p里面。同样的,要写一个字符的指针,就应该是:
char ch='a';
char * q=&ch;
所以,每一个变量都有地址,因为这个地址可以很好的指向这块空间,也就是说他可以找到这块空间,所以我们把这个地址抽象的称为指针,所以当一个变量储存到指针上(像上面的p),我们就称为指针变量。这里只是简单了解一下,后面我们还会更深入的学习指针。
11.结构体
在C语言中,结构体(struct)是指由一系列具有相同类型或不同类型的数据构成的数据集合。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。
简单的说,结构体使得C语言有能力描述复杂类型。
struct book
{
char name[20];//书名
int price;//价格
long num;//编号
char category[15];//类别
};
struct book s = {"c语言编程入门", 58, 04958751469, 计算机类};
//给s打印结构体信息
printf("name = %s price = %d num = %ld category = %s\n", s.name, s.price, s.num, s.category);
//为结构成员访问操作符
像上面的,就是所谓的结构体,填入相关数据,让c语言有更加好的描述环境。
好啦,本篇文章到此结束啦,这里是简单的结束了c语言中很多重要的东西,让我们初步的认识c语言,有一个大概的思想框架,让我们接下来继续努力学习c语言吧。另外,本人小白,有错误敬请纠错,第一次写这么长的文章实属不易,如果各位看官觉得还行,不妨给个一键三连,一起成长一起学习鸭!