小菜的C语言之路——第二课


前言

继上一篇文章,本篇文章将上一篇未讲述的变量部分补充完整,同时也将讲述字符串、转义字符和注释,以及选择语句、循环语句等相关知识。


一、变量与常量

1.1变量的作用域与生命周期

	作用域(scope):是程序设计的概念,通常来说,一段代码中所用到的名字并不总是有效的的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
	上面是作用域的概念,我们简单理解一下:作用域就是起作用的范围,一个变量在哪里可以使用,那里就是作用域
	生命周期:变量创建到销毁的一个时间段,也就是进入作用域,变量的生命周期开始;离开变量的作用域,生命周期结束

1.1.1局部变量作用域和生命周期:

直接上代码:

#include<stdio.h>

void test()
{

	printf("%d\n", a);//此处用a,但a在main函数的{}内定义,此处并非是其作用域固不可使用。//此处是错误代码
}
int main()
{
	int a = 10;//此处定义的a,并且a在main函数的{}内-->a是局部变量
	printf("%d\n", a);//作用域内,可以使用a
	{
		int b = 20;	//此处定义的b,在{}内,是局部变量,
		printf("%d\n", b);//作用域内,可以使用b
		printf("%d\n", a);//此处虽然在另一个{}内,但同时也在定义自己的main函数{}内,固仍然在作用域中,可以使用。
	}
	printf("%d\n", b);//但在此处,已经离开b的作用域(b所在{}外),所以b不能使用也可以说,b的生命周期结束了。//此处也是错误代码
	return 0;
}

1.1.2全局变量的作用域:

#include<stdio.h>

int a = 100;//此处在大括号外部,是全局变量a。

void test()
{
	printf("2:%d\n", a);//此处可以使用a,语法正确,但没必要
	
	//因为主函数没有调用,test函数未被调用,依然不会打印a。
	//程序是从main函数开始,遍历main函数后,程序结束。
}

int main()
{
	printf("1:%d\n", a);//在a的作用域内,可以使用。
	
	return 0;
}

1.1.3一点思考

不会调试的同学,先看第一张图,再转而看第二张图。相信你会豁然开朗。
会调试的同学,可以复制我的代码用自己的编译器,调试一下,就可以轻松明白test函数中的a也在作用域内,

#include<stdio.h>
void test()
{
	printf("2:%d\n", a);//此处a可以使用,在作用域内,尝试调试找到原因。
}
int main()
{
	int a=100;//a是局部变量,在main函数{}内部。
	printf("1:%d\n", a);//在作用域内,可以使用
	test();//调用test函数,
	return 0;
}

我们变形一下,看另一张图。

#include<stdio.h>
int main()
{
	int a=100;//局部变量
	printf("%d\n", a);//作用域内,可以使用
	void test();
{
	printf("%d\n", a);//a虽然在test函数的{}内,但其仍然在mian函数的{}内部;固在作用域内。
}
	return 0;
}

看完后有没有豁然开朗呢?

1.2.常量

C语言中常量和变量的定义有所差异

1.2.1常量的种类

a.字面常量

100 整形字面常量
‘D’ 字符字面常量
3.14 浮点型字面常量
"abcdef"字符串常量

b.const修饰的常变量

	const int num = 10;//num本质是变量,具有常属性,不能被修改,可以认为被上锁了,不让你变化。
	printf("%d\n", num);//10
	num = 20;//num此时具有了不能修改的属性,但本质是变量,此处编译器报错。
	printf("%d\n", num);//10

简单验证一下常变量是常量还是变量

#include<stdio.h>
int main()
{
	//数组
	
	int arr1[10]={0};//正确
	int num=10;
	int arr2[num]={0};//此句代码也会报错,因为num是变量
	
	const int n = 10;
	int arr[n] = { 0 };//表达式必须包含常量、n虽然被const修饰,具有了常属性,不能被修改,但是本质上还是变量,不能用来指定数组的大小。//此句代码会报错,所以常变量是变量。
	//下面代码在支持C99的编译器中是可以编译的
	//在C99中,引入了:变长数组的概念,变长数组的大小是可以使用变量来指定的,但是数据不能初始化
	//VS2022是不支持C99中的变长数组,所以没法验证。看下图验证
	//	int n = 10;
	//	int arr[n];
	
	return 0;
}

VS不支持:
请添加图片描述
此处使用vim编辑器,gcc编译器。
请添加图片描述
我们会发现,边长数组是不可以初始化,且只有支持C99语法编译器的才可以使用。

c. #difine定义的标识符常量

先学会怎样写,后续会再次学习。

//#define 定义的标识符常量

#define MAX 1000//不要加分号

int main()
{
	int arr[MAX];
#define MIN 0//不要加分号
	printf("%d\n", MAX);
	//MAX = 2000;此句代码会报错,MAX不可改。
	printf("%d\n", MIN);

	return 0;
}
d. 枚举常量

//枚举常量
//枚举——enum关键词
//枚举:有穷个,且包含较少项目。
//性别:男、女、保密
//三原色:Red Green Blue
//血型:ABO血型系统:A、B、O、AB
Rh血型系统:Rh阳性、Rh阴性

//有穷个,但包含项目很多。或者无穷个。

enum Sex 
{
	//下面三个符号是Sex这个 枚举类型 的未来的可能取值
	//枚举常量男、女、保密
	MALE=5,//0   //5,此处可以赋值
	FEMALE,//1   //6
	SECRET //2   //7
};//分号不要忘记

int main()
{
	enum Sex s=FEMALE;//可以看作一种类型enum Sex  ,s是名字,给其赋值,只能赋自己所包含的项。
	//默认取值0开始递增
	//赋初值,再递增
	printf("%d\n", MALE);//0
	printf("%d\n", FEMALE);//1
	printf("%d\n", SECRET);//2
	//MALE=5;常量不可改变,不能再此处赋值

	return 0;
} 

二、字符串、转义字符、注释

2.1字符串

2.1.1 字符

字符:电脑上面能敲出来的单个符号
‘a’
‘w’
'1’和1不一样

字符串:由双引号引起来的一串字符
“abcde”
特别注意:字符串结束标志是 \0(转义字符),且 \0 不算入字符串内容。

接下来验证\0的存在,并学习strlen函数的使用
记得引用头文件:string.h

#include<string.h>
int main()
{
	      char   c1  =  'a'  ;  //切记使用单引号
	//   字符型 变量名= '字符';
	char c2 = 'b';//字符

	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	int len=strlen(arr1);//此处计算"abc"的长度————3
	printf("%d\n", len);//3

	len = strlen(arr2);//此处计算数组arr2的长度,可是字符串,需要\0结束,而初始化并没有给出。所以编译器会在内存中继续寻找。直到找到\0.结束 。
	printf("%d\n", len);//此处打印随机值,结果看下图。
	//strlen 是一个库函数,专门用来求字符串长度的
	int len2 = strlen("abcdef");//  abcdef\0
	//strlen在求字符串的长度时,统计的是\0之前的字符个数
	printf("%d\n", len);//6
	return 0;
}

好烫!!!哈哈哈
请添加图片描述

2.2转义字符:让原字符意义改变

请添加图片描述

//  \0
//  \n
//转义字符

int main()
{
	printf("abcndef\n");
	printf("abc\ndef");//换行了
	printf("abc0def");//默认有\0
	printf("abc\0def");//字符串提前结束了
	return 0;
}

在ANSI C标准中,定义了9个三字母词(trigraph),三字母词就是几个字符的序列,合起来表示另一个字符。三字母词使C语言环境可以在缺少一些必需字符的字符集(比如,一些非常老式的键盘上没有[]{}#^~|)上实现
请添加图片描述
显然可以看到VS2022不支持三字母词。

在支持三字母词的编译器上:
从上表可以发现三字母词借助于?实现。
(are you ok ??)实际是(are you ok]

(are you ok ??)实际是(are you ok ? ? )
?是转义字符的一种

请请添加图片描述
添加图片描述


int main()
{
	//         \?
	//       三字母词
	//      ??) ——> ]
	printf("(are you ok??)");//
	//(are you ok ??)实际是(are you ok]

	//(are you ok]

	//(are you ok \?\?)

	printf("%c\n", 'a');
	printf("%c\n", 'q');
	printf("%c\n", '\'');//此处打印一个单引号,但其会自动和括号内的’配对,导致报错,所以使用转义字符 \'

	printf("%s\n", "abc");
	printf("%s\n", "a");
	printf("%s\n", "\"");//  此处与单引号类似,自动配对
	
	return 0}

请添加图片描述

#include<stdio.h>
int main()
{
	printf("%s\n", "abc\\ndef"); //前一个\取消了后面 \n的作用,与前面\'  \"  \?类似  但自身\还保留。
	printf("c:\\net\\nest.c");//前面一个\取消了后面\n的作用,与前面\'  \"   \?类似  但自身\还保留,根据这个特性,可以写你电脑中某个文件的路径

	printf("\a");//电脑嗡鸣声,把声音放大即可。\a
	printf("ab\bcdef");//  \b ,退格(删除光标前一个),打印结果:acdef

	printf("%c\n", '\130');//ASCII.  /ddd  八进制(随后讲解)
	printf("%c\n", '\51'); //感兴趣可以去了解万国码。

	printf("%c\n", '\x63');  //xdd  十进制(随后讲解)
	return 0;
}

2.3注释

1.代码中有些不需要的代码可以直接删除,也可以注释掉。——使其不起作用

2.代码中有些代码难以理解,加文字注释,便于解读

注释有两种风格:
C语言注释风格:
/XXXXXX/
不能嵌套注释。

c++注释风格:(C99之后也支持)
//xxxxxx
可以注释一行到多行。


三.选择语句

if else 语句
switch case语句

int main()
{
	int input = 0;
	printf("你要好好学习吗(1/0)?\n");
	scanf("%d", &input);
	if (input == 1)
	{
		printf("取得好offer\n");
	}
	else
	{
		printf("卖红薯\n");
	}

	//switch语句后面会学到
	return 0;
}

4.循环语句

for语句
while语句
do while语句

 int main()
{
	int line = 0;
	printf("好好学习\n");

	while (line < 20000)
	{
		//...
		printf("敲代码:%d\n", line);
		line++;
	}
	if (line >= 20000)
	{
		printf("获得好offer,迎娶白富美\n");
	}

	return 0;
}



总结

今天的分享到这里就结束了,有些地方随后会细细道来。感兴趣的请持续关注。
拜拜了您嘞!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值