导语
大家要清楚一件事,C语言有C语言的语法,就像汉语和英语都有自己的规则一样,美国人学中文也觉得别扭,国人学英语也别扭,经常中式英语,所以你学什么语言就要遵守什么语言的语法规则,有些地方不要过度深究,不然你的思绪就会越来越乱!
1.字符串+转义字符+注释
字符串
“Welcome to League of Legends\0”;
这种由双引号引起来的一串字符称为字符串字面值,简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。
举个例子
#include <stdio.h>
//下面代码,打印结果是什么?为什么?(突出'\0'的重要性)
int main()
{
char arr1[] = "lol";
char arr2[] = {'l', 'o', 'l'};
char arr3[] = {'l', 'o', 'l', '\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
arr1[] arr2[] arr3[] 这个东西叫做数组,你先当它是储存字符串的变量就好了,关于数组后面会说。
让我们来运行这段代码试一试:
看到第二个打印出来的内容我们就疑惑了,心里想我明明要打印lol这个字符串可是却出来一堆乱码,这是怎么回事呢?
刚才我们说了,\0 是转义字符也是字符串结束的标志,如图:
你看,这就是数组里储存方式,打印从l开始,往后打印,遇到\0自然会停下来,因为你后面根本不知道后面有什么,图片里数组只储存了四个字符,后面的没有进行初始化,所以是随机值,随机值当中包括 \0 ,但是你不知道能在哪里可以遇到 \0 ,也就造成打印了一些乱码,然后在某一个地方遇到了野生的 \0 才会停下来。
那么会有人说,arr1[] 不是也没有 \0 吗,其实字符串是自带 \0 的,所以很正常。
而第二个就不一样了,他是一个字符一个字符储存进去的,并没有带 \0 ,所以它就只能往后走,遇到一些不明生物最终才找到野生的 \0 .
第三个虽然也是一个字符一个字符放进去的,但是最后放进去了一个 \0 进去,所以纸打印了 lol .
转义字符
假如我们要打印这个目录路径: c:\code\test.c
这个我们怎么写代码?
#include <stdio.h>
int main()
{
printf("c:\code\test.c\n");
return 0;
}
是这样吗?我们一起来看一下运行结果:
这结果和我们想要的结果不一样,这是为什么呢?
这就涉及到了我们刚才提到的转义字符,转义字符顾名思义就是转变意思。
下面看一些转义字符。
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 |
\’ | 用于表示字符常量’ |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字。 如: \130 X |
\xdd | dd表示2个十六进制数字。 如: \x30 0 |
什么是三字母词?这就是
三字母词 | 对应的字符 |
---|---|
??= | # |
??( | [ |
??) | ] |
??< | { |
??> | } |
??/ | / |
??! | | |
??’ | ^ |
??- | ~ |
例子:
printf(“Eh??)”);
相当于
printf(“Eh]”);
但是这种问题是不会出现在我的VS2022编译器上的,我也没有过多的了解,暂时先放一放.
我们来看看一些常用的转义字符是干嘛的:
#include <stdio.h>
int main()
{
printf("%c\n", '\'');
printf("%s\n", "\"");
printf("\a");
return 0;
输出结果如下
就和上面表格介绍的一样,\n是换行,不然这两个字符都会在第一行仅仅的贴在一起, \a 是怎么一回事呢?它运行的时候会让你电脑触发你操作系统的提示音,我的是win11,有的人是win10,蜂鸣声音就不一样,大家可以试一下.
剩下的就不一一介绍了,有兴趣的好兄弟可以试一下.
关于字符这里的知识,我要多句嘴,就是ASCII值
这个是ASCII对照表,我们可以看到这些字符都有对应的数字.
因为我们都知道.计算机储存数据是二进制 0 1 这两个数字,而字符缺不是数字,那么它是怎么储存到我们计算机里的呢,就是对应的ASIIC值,最后这些数字由十进制转化为二进制.关于
例:
printf("%c",‘A’+2);
输出结果为 C
因为字符A的ASCII的值是65,加上2之后是67,67对应ASCII表我们发现其实是字符C,然后我们又用%c(这是打印字符的)的形式打印出来,所以打印的是C,也就是说字符的确是以数字形式储存的.
注释
- 代码中有不需要的代码可以直接删除,也可以注释掉
- 代码中有些代码比较难懂,可以加一下注释文字
比如:
#include <stdio.h>
int Add(int x, int y)
{
return x+y;
}
/*C语言风格注释
int Sub(int x, int y)
{
return x-y;
}
*/
int main()
{
//C++注释风格
//int a = 10;
//调用Add函数,完成加法
printf("%d\n", Add(1, 2));
return 0;
}
这里我解释一下,在你的编译器里,以/* 这个符号开头,以 */ 这个符号结尾,两个两个一对,中间的任何文字,数字,字符都是不被编译器识别的,这是C语言的注释风格, // 这个是C++注释风格,被修饰的一行都不过会被编译器识别.
C语言风格的注释 /xxxxxx/
缺陷:不能嵌套注释
C++风格的注释 //xxxxxxxx
可以注释一行也可以注释多行
注释通常用来解释你这段代码是干嘛的,让你的代码更能让人读懂,能让你的同事更好的和你合作.
比如,有些时候你自己定义的变量不是单词,只是一个字母,别人很难能看懂,这时候你就要写注释了.
2.选择语句
我们生活当中会有各种各样的选择,比如说
大家都能接到诈骗电话,如果你选择了相信,可能你会哭死,如果你选择不相信,那么你就逃过一劫.
C语言也有选择语句,今天先来介绍一种最常用的选择语句,if语句.
#include <stdio.h>
int main()
{
int coding = 0;
printf("你会给骗子汇款吗?(选择1 or 0):>");
scanf("%d", &coding);
if (coding == 1)
{
printf("是的.结果,你知道自己被骗了,不甘心,决心和骗子斗智斗勇,结果你又被骗了很多钱,你破产了!\n");
}
else
{
printf("不要.结果,你逃过一劫\n");
}
return 0;
}
如果你输入1,恭喜你倾家荡产,如果你输入0,那么就逃过一劫.
我们来看这个if语句,它后面的括号是判断条件.也就是选择条件,注意看 == 这个符号,他不是赋值,他是判断两端是不是相等,这个还可以这么写,1 == coding ,在C语言这种语法是允许的.而赋值是被改变的变量必须在左边.
下面那个 else 是上面的 if 没有成立会选择 else 大括号里面的内容如果我们输入0或者是其他不等于1的数字,if语句就会先判断,.coding不等于1,那么就选择else里面的内容.
有人想问,if语句只能有两种选择吗?并不是,如果有多种情况的话,你在 if 和 else 中间加一个else if 就可以了,但是需要加判断条件,像这样.
#include <stdio.h>
int main()
{
int coding = 0;
printf("你会给骗子汇款吗?(选择1 或者是0或者其他):>");
scanf("%d", &coding);
if (coding == 1)
{
printf("是的.结果,你知道自己被骗了,不甘心,决心和骗子斗智斗勇,结果你又被骗了很多钱,你破产了!\n");
}
else if(coding == 0)
{
printf("你给骗子忽悠到怀疑人生了!");
}
else
{
printf("不要.结果,你逃过一劫\n");
}
return 0;
}
这个样子你输入0就是你忽悠骗子了,输入除了1和0之外就是逃过一劫.
注意,单个的else只能放在最后,先了解到这里,后面我会详细的讲解if语句.
3.循环语句
有些事必须一直做,比如我们每天都要吃饭睡觉.
或者是
你进入大学,可以先买彩票碰运气,要是真的能中5000万,OK,以后你可以横着走,如果你没有用就老老实实学习,提升自己能力才是最稳的,学的不够到位就是菜鸟,学的好就是大佬,有个好文凭,优秀的技术和知识储备量,那么你同样也能走上人生巅峰.
C语言同样也有循环语句:
while语句-讲解
for语句(后期讲)
do … while语句(后期讲)
让你打印20000次我要继续努力敲代码这句话
你不可能真的一遍一遍的去敲printf(“我要继续努力敲代码这句话”);
就算复制粘贴都需要很久,所以要让你的编译器帮你完成这个任务!
//while循环的实例
#include <stdio.h>
int main()
{
printf("开始编程\n");
int line = 0;
while(line<=20000)
{
line++;
printf("我要继续努力敲代码\n");
}
return 0;
}
输出的结果就是两万行 我要继续努力敲代码 这句话.
++ 这个运算符号你可以认为它是line =line+1.每一次进入这个循环,line都会加一.
我们一起来看一下这个while循环语句,后面大括号和if语句一样,都是判断的地方,这里是变量line<=20000的判断条件,那么他在line等于20001的时候不在进入这个循环,因为判断条件已经不成立了.
在这里我要说明一点,无论哪一个语句,有判断条件情况下,结果为零就是假,就等于这个条件不成立;非零就是真,条件等于成立;有人就说了,刚才那个coding == 0 是怎么回事?这个判断条件就是让coding等于假能进去,如果没有这种规定,判断条件是假,那么一定进不去.
#include <stdio.h>
int main()
{
printf("开始编程\n");
int line = 0;
while (0)
{
line++;
printf("我要继续努力敲代码\n");
}
return 0;
}
我把条件改成了0,输出结果如下:
果然,原来的2万行现在一行没有.
4.函数
函数我们已经接触一点点了,比如main函数printf函数,当然它可不是我们认知的数学那些函数.
先来一段代码,我们一点点分析:
#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;
}
上述代码写成函数如下
#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;
}
看到main函数外面的那个Add函数了吗,这就是我们自定义的函数.
首先我们要知道,函数是什么样子的,我们可以看到,自己定义的名字,就和变量一样,但是不可以定义和库函数重名的函数,库函数你们以后会知道的,假如你定义了一个printf函数买这个本身就是个函数,再次定义就冲突了,人家会默认为你写的是printf函数而不是你定义的函数.
函数除了名字,后面的是圆括号,这里面是参数,你要传进去什么的参数,我们先看main函数里面的Add函数的参数,把变量num1 num2传进去了,main函数外部的Add函数用int x int y来接收,为什么呢?
这是函数的语法规定,你传进去的是整形的参数那么你就要用整形的参数来接收,你要声明一下我的这个x y是整形才能接收,至于x y这两个临时变量(因为生命周期仅仅在Add函数内有效)名字是你自己定义的,和变量一样,名字也可以是num 1num 2
他们名字前面的int又是什么呢?这是地方是函数的返回类型,我们这段代码要算加法,运行完之后我们要返回一个值,return就是返回的意思,后面空格加上你要返回的就可以了,不可只能返回一个值,一旦返回,return后面的代码将不会被执行,这里返回的是z,z是我们在Add创建的临时变量,我们当然不是真的返回z,而是返回z里面的整形数据,也就是两数相加的和,因为返回的也是一个常量,所以并不会被销毁,
所以说,返回的是什么类型,函数名前面就要加上什么类型,如果你不需要返回,那么请在你的函数名前写上void
那么,自定义的函数道义有什么意义呢?它可以不用麻烦的做一段重复的事情,还可以节省空间,你想想,如果自定义函数里是非常复杂的计算公式还有很多东西,你难不成用一次复制粘贴一次吗,这样很浪费空间和时间,需要的时候直接调用就行
就像printf这个函数一样,你只需要引头文件声明一下就可以了,也就是和人打一下招呼,我要用这个函数了,就是我们之前看到的#include <stdio.h>,并不需要你把源代码复制粘贴,那样太麻烦
函数的特点就是简化代码,代码复用。
5.数组
数组挺重要的
数组定义
int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,最多放10个元素
char arr1 [4] ="lol";//定义一个字符数组,最多放4个元素
int arr2[]={1,2,3,4,5,6,7,8,9,10};//定义一个整形数组,里面有10个元素
char arr3[]="lol";//定义一个字符数组,加上\0,已经有4个元素了
首先,这是数组的初始化,数组是能储存多个元素的变量,你想储存什么类型的元素就在数组名前面加上类型,很显然,arr arr1 arr2 arr3 就是数组名,也是变量
因为arr1可以容纳10个元素,我们又初始化了十个元素,所以我们叫做完全初始化
而后面的 [ ] 是什么呢,这个是数组的结构,[ ]里面的常量是决定数组能容纳多少元素,如果[ ]里面没有写,像arr2 arr3那样,那么它会看后面自己有多少个元素就决定自己能容纳多少个元素,不会多不会少.
如果说初始化的是int arr [10] ={1,2,3};那么后续的7个元素是什么呢?因为arr可以容纳10个元素,但是只初始化了3个元素,那么系统会默认剩下7个元素为0
这里我们叫做未完全初始化
数组的下标
C语言规定:数组的每个元素都有一个下标,下标是从0开始的。
数组可以通过下标来访问的。
比如:
int arr[10] = {0};
//如果数组10个元素,下标的范围是0-9
蓝色部分是我们的元素
我们每个元素都是从从下标为0一直向左走,在我们规定的范围内,我们已经把这个地方的"原住民"给替换掉了,全都换成了0 ,所以在这个范围内是安全的,如果你想越界,那么你肯定不知道外面的是什么东西,因为都是随机值,就像之前说的字符串一样.
数组的使用
我们先用数组的下标来试着访问数组里每个元素:
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
printf("%d ", arr[0]);
printf("%d ", arr[1]);
printf("%d ", arr[2]);
printf("%d ", arr[3]);
printf("%d ", arr[4]);
printf("%d ", arr[5]);
printf("%d ", arr[6]);
printf("%d ", arr[7]);
printf("%d ", arr[8]);
printf("%d ", arr[9]);
return 0;
}
有人问,为什么printf函数后面为什么这么写?这就是C语言的语法,嗯,至于和初始化确实很像,不过,这次[ ]里面的值不仅仅是常量,变量也可以,这个后期会演示,[ ]里面的值是下标的数,这是我们的打印结果:
这就是数组的使用,数组我们就先了解到这里,后期会详细讲解
今天我们的内容是
1.字符串+转义字符+注释
2.选择语句
3.循环语句
4.函数
5.数组
重点: \0 是字符串的终止标志.
转义字符虽然作用多,但是别忘记只要加了 \ 这个符号你可能就会少打印一个字母或者是数字,多打印了一些奇怪的东西.
注释要好好利用,不仅仅可以快速屏蔽代码,还可以让人更容易读懂你的代码!
选择语句和循环语句最重要的就是判断条件.
函数在传参的时候一定不要忘记声明一下你传过去的是什么类型,也不要忘记返回类型.
数组一定不要越界,要在规定范围内活动,下标是从0开始,不是从1开始.