初识C语言--第二弹

本文介绍了C语言的基础概念,包括局部和全局变量的作用域,以及它们的生命周期。同时讲解了常量(const、#define和枚举)、字符串操作(定义、长度计算和转义字符)以及注释和选择语句(if-else)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初识C语言(二)

前言
👻作者龟龟不断向前
👻简介宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。
👻专栏C++初阶知识点
在这里插入图片描述
如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持博主🙊,如有不足还请指点,博主及时改正

初识C语言(二)

🚀1.作用域与生命周期

🍉作用域

作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用
的而限定这个名字的可用性的代码范围就是这个名字的作用域。

🍇局部变量作用域

局部变量所在的局部范围(代码块)

#include<stdio.h>

int main()
{
	{
		int a = 0;
		printf("%d\n", a);
	}
	printf("%d\n", a);//error,由于a的作用域是上一个代码块,无法在这一行使用
	return 0;
}

​ 通常我们将 {}所包围的区域 叫做 代码块

这里有些同学经常误认为局部变量的作用域是main函数的范围,这是不准确的,局部变量所在的{}范围是其对应的作用域!


🍇全局变量的作用域

整个工程–局部变量不仅仅只局限于main函数的代码块,在其他的函数代码块依旧能使用。

#include<stdio.h>

int global;//声明

void test()
{
	printf("%d\n", global);//这里的值是100000
}

global = 100000;//不写这个,输出0,全局变量默认值为0

int main()
{
	printf("%d\n", global);
	test();
	return 0;
}

​ 这里我们可以看到,局部变量global不仅仅在main函数的代码块可以用,在test函数的代码块也可以使用

上述代码对global进行声明的原因是,编译器是向上扫描,向下执行的,如果不写int global;这句代码,那么编译器执行test函数的时候,就不知道global是什么意思了,int global;就是告诉编译器后面有global这个全局变量,而且值由后面的定义决定(默认是0)


​ 不仅如此,就算是多个源文件中只有一个全局变量,这个全局变量也可以在每个源文件中都可以使用,因为其作用域是整个工程

在这里插入图片描述

在这里插入图片描述

​ 这样全局变量global也是可以正常使用的

注意,如果全局变量在外部源文件中,声明方式和上面的略有不同,需要在前面加上==extern关键字–进行外部声明。==


🍉生命周期

变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

作用域和生命周期是两个不同的概念,但是他们之间又是存在联系的

🍇局部变量的生命周期

​ 程序也是有生命周期的,或者说是运行时间。而我们上述所说的,局部变量的作用域与其声明周期是有联系的。

局部变量生命周期:进入作用域生命周期开始,出作用域生命周期结束。

在这里插入图片描述

🍇全局变量的生命周期

全局变量的生命周期是:整个程序的生命周期。


🚀2.常量

🍉const修饰的常变量

用法如下:

#include<stdio.h>

int main()
{
	const int n = 10;
	n = 200;//error
	return 0;
}

​ 我们可以发现上述代码是编不过去的,n不允许被修改,这就和常量很像了,常量是不变的

可是为什么又叫常变量呢?

在此之前我们要介绍以下数组的概念

C语言中给了数组的定义:一组相同类型元素的集合

语法:元素类型 + 数组名 + [元素个数]//元素个数只能是常量

在这里插入图片描述

#include<stdio.h>

int main()
{
	const int n = 10;
	int arr[n];//error--报错
	return 0;
}

​ 这里我们运用了数组元素个数必须是常数的属性,进而证明了上述的n其实还是一个变量,只是具备了常属性(不能被修改)而已


🍉#define修饰的标识符常量

​ 目前文章暂时不做深究,大家了解其用法即可

#define M 10

#include<stdio.h>

int main()
{
	printf("%d\n", M);
	int arr[M];
	return 0;
}

🍉枚举常量

一 一列举出一些常量

enum RGB//三原色
{
	RED,
	GREEN,
	BLUE
};


int main()
{
	enum RGB Color = BLUE;
	printf("%d\n", RED);
	printf("%d\n", GREEN);
	printf("%d\n", BLUE);
	int arr[BLUE];//无意义--只是为了测试枚举常量是常量
	return 0;
}

​ 还是一样对齐不做深究,大家先知道有这么个东西即可


🚀3.字符串

"hello bit.\n"

这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符
串。

注:字符串的结束标志是一个 \0 的转义字符在计算字符串长度的时候 \0 是结束标志,不算作字符串
内容。

🍉定义字符串

​ 既然字符串是一串字符,但是我们前面介绍的数据类型里面并没有字符串类型,但是咱么可以使用字符数组来存储字符串

#include<stdio.h>

int main()
{
	char str1[] = { 'a', 'b', 'c' };
	char str2[] = "abc";
    printf("%s\n",str1);//%s--输出字符串
    printf("%s\n",str2);
	return 0;
}

上述代码定义数组的时候,[]里面并没有填元素个数,这个语法是允许的,编译器会自动帮我们计算元素个数,然后填入[]

上述的str,str2看似定义相同,其实天差地别

在这里插入图片描述

​ 根据字符串的定义:双引号引起来的一串字符叫做字符串,并且字符串是有\0作为结束标志的,所以"abc"看似只有abc其实暗含着\0,所以\0也放入了数组str2中。所以str1abc后输出随机值(随机值里面也可能有\0),而str2正常输出

在这里插入图片描述


🍉计算字符串的长度

库里面设计了一个函数strlen帮助我们直接计算字符串的长度

strlen- string length

#include<stdio.h>

int main()
{
	char str1[] = { 'a', 'b', 'c'};
	char str2[] = "abc";
	printf("%s:", str1);
	printf("%d\n", strlen(str1));
	printf("%s:", str2);
	printf("%d\n", strlen(str2));
	return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBXpPHvf-1666084161771)(C:\Users\Cherish\AppData\Roaming\Typora\typora-user-images\image-20221018152227958.png)]

这个11并不是必然产生的是随机的,大家运行上述代码可能是其他值。


🍉转义字符

有些字符看起来是\0,\n,\t,但是他们已经不再是原来的意思了,而被转变成了其他意思
例如我们经常写的\n–换行的意思
这样的字符我们将其成为转义字符

这里特别提醒大家,转义字符算一个字符,算字符串长度的时候大家要注意

其中转义字符有\和一些特定字符和数字组成

下面给大家列出C语言全部的转义字符

转义字符释义
\?在书写连续多个问号时使用,防止他们被解析成三字母词(现在编译器大部分没有)
\'用于表示字符常量’
\“ 用于表示一个字符串内部的双引号
\\用于表示一个反斜杠,防止它被解释为一个转义序列符
\a(assert)警告字符,蜂鸣
\b (backspace)退格符
\f (几乎无作用)进纸符
\n换行
\r回车
\t (Tab)水平制表符
\v(vertical)垂直制表符
\dddddd表示1~3个八进制的数字。 如: \130 X
\xdddd表示2个十六进制数字。 如: \x30 0

​ 不需要死记硬背,这里我们稍微理解一下:像' ,",\,如果我们像下面那样是没有办法打印出来的

#include<stdio.h>

int main()
{
	printf("%c\n", '\');
	printf("%c\n", ''');
	printf("%c\n", '"');
	return 0;
}

​ 如果这么写属实是把编译器给逼死了,编译器也不知道怎么识别,\是帮助编译器识别转义字符的,'是帮助编译器识别字符的,"是帮助编译器识别字符串的。如果后面什么都不加,编译器也识别不出来!

在这里插入图片描述

要想正常输出他们必须在前面加上\

#include<stdio.h>

int main()
{
	printf("%c\n", '\\');
	printf("%c\n", '\'');
	printf("%c\n", '\"');
	return 0;
}

​ 中间的那部分转义字符大家可用下面代码自行复制测试!

int main()
{

	printf("\a\n");//警告声assert
	printf("abcdef\bg\n");
	printf("abcdef\tg\n");
	printf("abcdef\vg\n");
	printf("C\\code\\classC\\test.c\n");//正常输出要多加一个\

	return 0;
}

​ 我们主要细讲\ddd,\xdd

这里我们介绍一下ASCII码

概念:

ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符 [1] 。

说人话就是:为了很好地在内存中存储字符,我们键盘上,甚至键盘上没有的一些字符都对应这一个自己的编号

例如a - 97 ,b - 98

ASCII码表:(键盘上面都敲出来的都有自己的ASCII码值

在这里插入图片描述


\ddd~1-3位的八进制数字,转换成十进制数字,在ASCII码中所对应的字符

\xdd~1-2位的十六进制数字,转换成十进制数字,在ASCII码中所对应的字符

这里我们讲一下,二进制,八进制,十六进制的联系转换成十进制

在这里插入图片描述

八进制和十六进制类似,a进制是由0-a-1的数字构成的

#include<stdio.h>

int main()
{
    printf("%c\n", '\123');//1*64 + 2*8 + 3*1 = 83

	printf("%c\n",'\x61');// 6*16 + 1 = 97

    return 0;
}

讲上面的数字算出来了之后,查一下ASCII码表即可

83-S,97-a

🍉笔试题
#include <stdio.h>
//转义字符算一个字符
int main()
{
	printf("%d\n", strlen("abcdef"));
	printf("%d\n", strlen("c:\test\628\test.c"));
	return 0;
}

要会区分转义字符是哪些


🚀4.注释

  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语言风格的注释 /*xxxxxx*/

    • 缺陷:不能嵌套注释
  • C++风格的注释//xxxxxxxx

  • 可以注释一行也可以注释多行


🚀5.选择语句

​ 人生处处面临选择,就比如一不小心你可能就遇到下面的场景

在这里插入图片描述

在这里插入图片描述

这书流程图是博主自己画的,画流程图推荐软件

🍉if-else语句
#include <stdio.h>

int main()
{
	int input = 0;
	printf("卡密萨马:请问这个金的斧头是你的?还是这把银斧头是你的?\n");
	printf("1-金斧头,2-银斧头,neither-都不是\n");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("你撒谎,you bad bad\n");
	}
	else if (input == 2)
	{
		printf("你撒谎,you bad bad\n");
	}
	else
	{
		printf("你真是个城市的孩子,请回吧\n");
	}
	return 0;
}

​ 大家可以结合上述的流程图来理解if-else语句

C语言中,我们使用==来表示相等,当if括号里面的是式子正确的时候,就会执行if里面的语句,不对的画就不执行!


🚀6.循环语句

​ 生活中处处有循环,例如以下情况

在这里插入图片描述

在这里插入图片描述

🍉while循环语句


int main()
{
	int line = 0;
	char input = 0;
	while (line <= 20000)
	{
		printf("敲代码,line = %d\n",line);
		++line;
		if (line == 5000)
		{
			printf("恭喜你,已经敲了5000行有效代码,是否要去谈一场轰轰烈烈的恋爱\n");
			printf("Y-yes,N-NO\n");
			scanf("%c", &input);
			if (input == 'Y')
			{
				break;
			}
		}
	}
	if (line > 20000)
	{
		printf("恭喜你,大牛,好offer\n");
	}
	else
	{
		printf("你的女朋友放弃了你。你成为了FW\n");
	}
	return 0;
}

break可以中途退出循环语句

本篇文章就到这,我们下期再见!

点赞

评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值