首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >抽丝剥茧C语言(初阶 中)

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

作者头像
有礼貌的灰绅士
发布2023-03-28 16:05:51
发布2023-03-28 16:05:51
74500
代码可运行
举报
运行总次数:0
代码可运行

C语言初阶(中)

导语

大家要清楚一件事,C语言有C语言的语法,就像汉语和英语都有自己的规则一样,美国人学中文也觉得别扭,国人学英语也别扭,经常中式英语,所以你学什么语言就要遵守什么语言的语法规则,有些地方不要过度深究,不然你的思绪就会越来越乱!

1.字符串+转义字符+注释

字符串

“Welcome to League of Legends\0”;

这种由双引号引起来的一串字符称为字符串字面值,简称字符串。 注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。 举个例子

代码语言:javascript
代码运行次数: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 这个我们怎么写代码?

代码语言:javascript
代码运行次数:0
运行
复制
#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编译器上的,我也没有过多的了解,暂时先放一放. 我们来看看一些常用的转义字符是干嘛的:

代码语言:javascript
代码运行次数:0
运行
复制
#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. 代码中有些代码比较难懂,可以加一下注释文字 比如:
代码语言:javascript
代码运行次数:0
运行
复制
#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语句.

代码语言:javascript
代码运行次数:0
运行
复制
#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 就可以了,但是需要加判断条件,像这样.

代码语言:javascript
代码运行次数:0
运行
复制
#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(“我要继续努力敲代码这句话”); 就算复制粘贴都需要很久,所以要让你的编译器帮你完成这个任务!

代码语言:javascript
代码运行次数:0
运行
复制
//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等于假能进去,如果没有这种规定,判断条件是假,那么一定进不去.

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
int main()
{
	printf("开始编程\n");
	int line = 0;
	while (0)
	{
		line++;
		printf("我要继续努力敲代码\n");
	}
	return 0;
}

我把条件改成了0,输出结果如下:

果然,原来的2万行现在一行没有.

4.函数

函数我们已经接触一点点了,比如main函数printf函数,当然它可不是我们认知的数学那些函数. 先来一段代码,我们一点点分析:

代码语言:javascript
代码运行次数:0
运行
复制
#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;
}

上述代码写成函数如下

代码语言:javascript
代码运行次数: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.数组

数组挺重要的

数组定义

代码语言:javascript
代码运行次数:0
运行
复制
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 ,所以在这个范围内是安全的,如果你想越界,那么你肯定不知道外面的是什么东西,因为都是随机值,就像之前说的字符串一样.

数组的使用

我们先用数组的下标来试着访问数组里每个元素:

代码语言:javascript
代码运行次数: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开始.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C语言初阶(中)
  • 导语
  • 1.字符串+转义字符+注释
    • 字符串
    • 转义字符
    • 注释
  • 2.选择语句
  • 3.循环语句
  • 4.函数
  • 5.数组
    • 数组定义
    • 数组的下标
    • 数组的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档