导语
大家要清楚一件事,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开始.