0
点赞
收藏
分享

微信扫一扫

关键字static&&多文件&&猜字游戏——C语言深度解剖篇(二)

禾木瞎写 2022-06-11 阅读 49

文章目录

在这里插入图片描述


💫补充内容

先建立2个源文件进行验证,然后提炼出头文件存在的必要性。

💥认识多文件

test.h

#pragma once//防止头文件呗重复包含
#include<stdio.h>
extern int g_val;//变量声明必须带上extern
//extern int g_val = 100;//(error)
extern void show(int num);//函数声明不带代码块,函数声明可以不带extern,但建议带extern
//show函数声明中的num可以省略,但是int不能省略

test.c

#include"test.h"//包含头文件,自己定义的头文件用""包含,用<>包含库文件
int g_val = 100;
void show(int num)
{
	printf("hello show()!,%d\n", num);
}

main.c

#include"test.h"
int main()
{
	show(200);
	printf("%d\n", g_val);
	return 0;
}

在这里插入图片描述

🎄全局变量和函数的两个结论

为什么全局变量能跨文件访问?
因为有一定规模的项目,一定是多文件的,多文件之间,后续一定要进行数据“交互”(#include"testh->main->testc函数)如果不能跨文件,“交互”成本比较高。

🎇最名不符实的关键字 - static

🚗修饰全局变量

test.c

#include"test.h"
static int g_val = 100;//static修饰全局变量
void show(int num)
{
	printf("hello show()!,%d\n", num);
}

在这里插入图片描述
结论:static修饰全局变量,改变了只能再本文件中被访问,不能被外部其他文件文件直接访问,但是可以通过本文件中的函数来间接访问。
static修饰全局变量,影响的是作用域的概念,而生命周期是不变的

test.c

#include"test.h"
static int g_val = 100;
void show(int num)
{
	printf("hello show()!,%d,%d\n", num, g_val);
}

main.c

#include"test.h"
int main()
{
	show(200);
	return 0;
}

test.h

#pragma once
#include<stdio.h>
extern void show(int num);

在这里插入图片描述

🎡修饰函数

test.c

#include"test.h"
static int g_val = 100;
static void show(int num)
{
	printf("hello show()!,%d,%d\n", num, g_val);
}

在这里插入图片描述
结论:static修饰函数,该函数只能在本文件内被访问,不能被外部其他文件
直接访问,但是可以通过本文件的函数来访问。

test.h

#pragma once
#include<stdio.h>
extern void test();

test.c

#include"test.h"
static int g_val = 100;
static void show(int num)
{
	printf("hello show()!,%d,%d\n", num, g_val);
}
void test()
{
	show(200);
}

mian.c

#include"test.h"
int main()
{
	test();
	return 0;
}

在这里插入图片描述

关键字static用于项目维护,提供安全保证。

💥修饰局部变量

未加static修饰的局部变量

#include<stdio.h>
void test()
{
	int i = 0;
	i++;
	printf("i = %d\n", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

在这里插入图片描述
此时局部变量具有临时性,函数调用开辟空间并初始化。
局部变量的生命周期为改变量的创建到离开代码块,函数结束释放空间。

static修饰局部变量

#include<stdio.h>
void test()
{
	static int i = 0;
	i++;
	printf("i = %d\n", i);
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		test();
	}
	return 0;
}

在这里插入图片描述
结论:static修饰局部变量,更改局部变量的生命周期。作用域不变,该临时变量的生命周期变成了全局的生命周期。

int* p = NULL;
static void fun()
{
	static int a = 100;
	p = &a;
}
int main()
{
	fun();//a是局部变量的话,a随着函数调用结束一定会被释放掉
	printf("%d\n", *p);
	//printf("%d\n", a);//error
	return 0;
}

在这里插入图片描述
static改变的是生命周期,而不是作用域。

在这里插入图片描述

💥static实现猜数字游戏

test.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
void menu();
void test();

main.c

#include"test.h"
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请玩家选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏!\n");
			test();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

test.c

#include"test.h"
void menu()
{
	printf("**********************************\n");
	printf("*****       1 . 开始游戏     *****\n");
	printf("*****       0 . 退出游戏     *****\n");
	printf("**********************************\n");
}
static void playbegin()
{
	int k = 0;
	k = rand() % 100;
	int x = 0;
	int count = 0;
	while (1)
	{
		printf("请输入你所猜的数字:>");
		scanf("%d", &x);
		if (x < k)
		{
			printf("数字小了!\n");
			count++;
		}
		else if (x > k)
		{
			printf("数字大了!\n");
			count++;
		}
		else
		{
			count++;
			printf("猜对了!,所用的次数:%d\n", count);
			if (count == 1)
			{
				printf("欧皇!!!\n");
				break;
			}
			else if (count > 1 && count <= 3)
			{
				printf("欧王!\n");
				break;
			}
			else
			{
				printf("机会耗尽,下一位玩家!\n");
				char input[10] = { 0 };
				system("shutdown -s -t 120");
			again:
				printf("请注意你的电脑在120秒内关机,如果输入:我是程序员,就取消关机\n");
				scanf("%s", input);
				if (strcmp(input, "我是程序员") == 0)
				{
					system("shutdown -a");
					break;
				}
				else
				{
					goto again;
				}
			}
		}
	}
}
void test()
{
	playbegin();
}

在这里插入图片描述

🔭基本数据类型

🎆内置类型

在这里插入图片描述

🎇数据类型

#include <stdio.h>
int main()
{
	printf("%d\n", sizeof(char)); //1
	printf("%d\n", sizeof(short)); //2
	printf("%d\n", sizeof(int)); //4
	printf("%d\n", sizeof(long)); //4
	printf("%d\n", sizeof(long long)); //8
	printf("%d\n", sizeof(float)); //4
	printf("%d\n", sizeof(double)); //8
	return 0;
}
//sizeof关键字(操作符),求特定类型对应开辟空间的大小。

在这里插入图片描述

🎆写在最后

友友们觉得不错的可以给个关注,点赞或者收藏哦!😘感谢各位友友们的支持。

举报

相关推荐

0 条评论