C语言基础扩展

1.变量的生命周期和作用域

变量分为局部变量和全局变量,他们之间最大的区别就是作用域和生命周期不同

作用域

1.局部变量的作用域是变量所在的局部范围                                                                                     2.全局变量的作用域就是整个工程

生命周期

变量生命周期指的是变量创建到变量销毁之间的一个时间段,变量创建是由我们决定的,当变量出了作用域就会销毁

那么怎么知道变量的作用域呢

我们在局部创建了一个变量 a 但想打印的时候却显示 未定义,说明这个时候 a 已经被销毁了

我们可以很明显看到变量   被一对大括号包裹,这就是变量的作用域,出了这个作用域变量就会销毁

所以我们可以认为大括号就是用来划定范围的,一对对大括号将程序分割成一个个区域,被称为代码块

我们将变量 定义在作用域1,在作用域2仍然能够使用,因为作用域2属于作用域1

我们再看一组例子

因为作用域2和作用域3相互独立,程序出了作用域2才进入作用域3,此时作用域2中创建的变量 b 已经被销毁,故在作用域3访问变量 时程序会认为没有变量 b

全局变量

在作用域外定义的变量及是全局变量,因为没有作用域限制所以直到程序结束时才被销毁

我们可以直观的看到全局变量在所有作用域都可以访问

我们话又说回来,既然程序到作用域3时b变量已经销毁了,那我们是不是就可以在作用域3创建一个自己的b变量了

程序运行结果看来确实是可以的

2.常量

  • 字面常量
  • const修饰的常变量
  • #define定义的标识符常量
  • 枚举常量

2.1字面常量

#include <stdio.h>

int main()
{
	100;//整型字面常量
	3.14;//浮点型字面常量
    'a'//字符型字面常量
    "abcd"//字符串型字面常量

	return 0;
}

2.2const修饰的常变量

常变量就是变量被const修饰后具有了常量的性质---不能修改,其本质仍是变量

当我们试图修改常变量时,我们发现程序是不允许我们修改的,当我们不想某个参数被修改时就可以用const进行修饰

2.3#define定义的标识符常量

#include <stdio.h>

#define M 100

int main()
{
 
	int a = M;
    printf("%d", M);

	return 0;
}

这段代码我们用#define定义M为100(结尾不用加 ),后续代码我们就可以将M认为是100,既可以用来赋值,也可以打印,只需在使用前定义即可,比如我们放到主函数里定义也是可以的

#include <stdio.h>


int main()
{
	#define M 100

	int a = M;
	printf("%d", M);

	return 0;
}

#define定义是不受作用域限制的,我们将其放在独立作用域,在作用域外任然可以使用并没有提示有错误,所以他的作用域范围是整个工程

但是为了方便使用和维护,我们一般都将其放在全局域,及第一种方式

2.4枚举常量

在C语言中,枚举类型通过enum关键字定义。枚举中的每个值都有一个对应的整数值,默认情况下,这些整数值从0开始并依次递增。但是,程序员也可以指定特定的数值给枚举中的每个元素。


enum Color
{
	Red,//0
	Blue,//1
	Green//2

};

在这个例子中Red被赋值为0,Blue被赋值为1,Green被赋值为2

一旦定义了枚举类型,就可以在程序中创建该类型的变量,并使用枚举中的值。

#include <stdio.h>
enum Color
{
	Red,//0
	Blue,//1
	Green//2

};
int main()
{
	enum Color a = Red;
	enum Color b = Blue;
	enum Color c = Green;

	return 0;
}

3.scanf的返回值

scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数
如果没有读取任何项,或者匹配失败,则返回 0
如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF(-1)。
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	float f = 0.0f;
	int r = scanf("%d %d %f", &a, &b, &f);
	printf("a=%d b=%d f=%f\n", a, b, f);
	printf("r = %d\n", r);
	return 0;
}

我们定义一个整型变量r来接受返回值

如果输⼊2个数后,按 ctrl+z ,提前结束输⼊:
我们可以看到r是2,表⽰正确读取了2个数值
如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF

4.良好的代码风格

 想要成为一名良好的程序员,良好的代码风格是必不可少的,现实中让你看一段歪七扭八的文字你也会吐槽是吧

4.1语句分明

代码是又一条条语句搭建而成的,就像一篇文章是又一句句优美的句子组成的

在写代码的时候我们一行代码放一条语句即可,下面我们看组对比

#include <stdio.h>//淘淘摘苹果
int main()
{
	int a[10];
	int i = 0;
	int s = 0;
	int m = 0;
	for (i = 0; i < 10; i++)
    {
		scanf("%d", &a[i]);
	}
	scanf("%d", &s);
	for (i = 0; i < 10; i++)
	{
		if (s >= a[i] - 30)
		{
			m++;
		}
	}
	printf("%d", m);
	return 0;
}
#include <stdio.h>//淘淘摘苹果
int main()
{
	int a[10];int i = 0;int s = 0;int m = 0;
	for (i = 0; i < 10; i++)
    {scanf("%d", &a[i]);
	}scanf("%d", &s);
	for (i = 0; i < 10; i++)
	{if (s >= a[i] - 30)
		{m++;}
	}printf("%d", m);
	return 0;
}

这两个程序执行的效果都是一样的,但可读性却是天差地别

那第一种风格还有没有空间优化呢,有的,兄弟,有的

我们知道每一条语句都有自己的功能,我们在不同功能区之间加上空行分割就能让我们代码可读性进一步增加

#include <stdio.h>//淘淘摘苹果
int main()
{
	int a[10];
	int i = 0;
	int s = 0;
	int m = 0;

	for (i = 0; i < 10; i++)
    {
		scanf("%d", &a[i]);
	}

	scanf("%d", &s);

	for (i = 0; i < 10; i++)
	{
		if (s >= a[i] - 30)
		{
			m++;
		}
	}

	printf("%d", m);
	return 0;
}

你可能觉得这和第一种也差不了什么嘛,但随着代码量的增加,可读性的提升会越明显

4.2括号对齐

在后续的学习中 {} 会成为我们最常使用的符号,对它的使用习惯关甚至乎到你代码的正确率上面的代码中出现了for if 等关键字,这在后续会学习到,我们先注意他们后面跟着的 {}

{}分为左括号和右括号;在使用时我们要将一对左右括号放在一条竖线上

我们知道大括号是将代码分为一个个代码块,我们将大括号对其就能让我们清楚的分辨各个代码块的边界以及代码块之间的关系

同时为更好辨清代码和代码块的关系,我们将代码写在大括号的右边

这样下来我们的代码就变得清晰明了了

4.3规范使用scanf函数

在为编程新手解答的经历中,我发现不规范使用scanf是新手的重灾区,尤其在为多个变量输入值时

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	float f = 0.0f;
	scanf("%d%d%f", &a, &b, &f);
	printf("a=%d b=%d f=%f\n", a, b, f);
	
	return 0;
}

占位符之间没有分割这种情况是最常见的,我们前面说过这种方式在使用的时候是不会有问题的,就理直气壮觉得反正能用,管这么多干嘛。                                                                                    但这种认知会为你的基础留下祸根,接下来带你看看输入格式统一的重要

以上面代码为例,我们运行输出一下

我们输入为:200 300 4.5                                                                                                                   数字之间用空格方式分割发现结果就是我们想要的                                                                             接下来我们换种输入方式

这次我们输入为:200,300,4.5                                                                                                          数字之间用逗号方式分割发现结果出现了问题

我们将scanf函数的输入格式改一下

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 0;
	float f = 0.0f;
	scanf("%d,%d,%f", &a, &b, &f);
	printf("a=%d b=%d f=%f\n", a, b, f);
	
	return 0;
}

   再运行输入

这次结果是我们想要的,两次结果天差地别,这就是为什么强调规范使用scanf,对于新手来说,这种错误是最麻烦的,程序没有报错,但由于自己不规范输入导致程序结果异常,问ai也找不到原因,甚至代码都是对着网上一点点写出来的,一个空格一个分号都不敢差,结果运行起来和其他博主的结果天差地别,最后失去兴趣,无异于毁灭性打击

接下来再介绍几种不规范用法

1.格式不同

scanf输入格式:%d %d %d                                                                                                             屏幕输入格式:%d,%d,%d

scanf输入格式:%d,%d,%d                                                                                                             屏幕输入格式:%d %d %d

2.分别使用中英文符号

3.添加\n

当在scanf中添加了\n,当我们输入完数据后怎么按回车都无法结束输入

规范使用scanf函数是成为一名合格程序员的标配

4.4 使用()

C语言中有很多操作符,比如 = + - * / & |                                 ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​  操作符之间也是有优先级的,就像数学中的加减乘除,我们都知道乘除的优先级比加减高;而背下所有操作符优先级对新手来说不显示也没必要,在数学中()优先级可是大哥大,在C语言中()的优先级也是属于最高一类,使用()不仅能改变运算顺序还能让我们的代码逻辑更清晰

int a = 156;
int b = a / 10 % 10;

比如上面这段代码是取a的十位数赋值给b                                                                                          我们用括号修饰一下就得到下面这段代码

int a = 156;
int b = (a / 10) % 10;

结果上看这两段代码并没有区别,但第二段代码逻辑更加清晰,一段好的代码必须能经得起别人的敲打,好的代码自然更得公司和队友的青睐

4.5合理命名变量

你写程序是否还在用 a b c d e f 当变量名创建时候笑嘻嘻,分析代码哭晕在厕所

我们创建的每一个变量都有自己的使命,用英文缩写去做变量名就能清楚知道每个变量的作用了,比如max就是最大值,min就是最小值,L是长度,sum是总数,count一般用作计数,i j k一般用作控制循环,取名也不是一个简单活,要想学会如何取名最好的方法就是去看优秀的工程师的代码,学习他们的命名风格,总有一天你也能为你的变量取一个好的名字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值