抽丝剥茧C语言(初阶 中)

简介: 抽丝剥茧C语言(初阶 中)

导语

大家要清楚一件事,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,也就是说字符的确是以数字形式储存的.

注释

  1. 代码中有不需要的代码可以直接删除,也可以注释掉
  2. 代码中有些代码比较难懂,可以加一下注释文字
    比如:
#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开始.

相关文章
|
6月前
|
C语言
C语言初阶⑧(结构体)知识点和笔试题
C语言初阶⑧(结构体)知识点和笔试题
57 0
|
5月前
|
C语言
C语言初阶:如何判断是否为素数并且输出
C语言初阶:如何判断是否为素数并且输出
42 0
|
4月前
|
编译器 C语言
【C语言初阶】指针篇—下
【C语言初阶】指针篇—下
|
4月前
|
存储 C语言
【C语言初阶】指针篇—上
【C语言初阶】指针篇—上
|
5月前
|
C语言
【初始C语言8】详细讲解初阶结构体的知识
【初始C语言8】详细讲解初阶结构体的知识
|
6月前
|
程序员 编译器 测试技术
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
45 1
|
6月前
|
C语言
C语言初阶测评
C语言初阶测评
31 0
|
6月前
|
算法 编译器 C语言
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(下)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
40 0
|
6月前
|
编译器 C语言 C++
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(上)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
30 0
|
6月前
|
存储 编译器 C语言
C语言初阶⑦(指针初阶)知识点+笔试题(下)
C语言初阶⑦(指针初阶)知识点+笔试题
44 0