Simple understanding of EOF, static, #define

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

了解EOF!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//
//int main()
//{
//	int a = 0,b=0,c=0;
//	int ret = scanf("%d", &a);//输出后发现 ret=1,意思是它读到的有效数字个数为一个
//	int ret2 = scanf("%d%d", &b, &c);//类比↑
//	//如果在vs(其他编译器可能按一次就够了)里面按三次ctrl+z+回车(这里打了ret和ret2所以6次) 发现ret=-1
//	//而-1是谁?是EOF∴scanf读取失败的时候会返回EOF
//	//如果读取正常的话,返回的是读取到的数据的个数
//	printf("ret=%d\n", ret);
//	printf("ret2=%d\n", ret2);
//	printf("a=%d\n",a);
//	return 0;
//}
而EOF到底有什么用呢?多组数的场景可能会用到



//了解关键字 static!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

//用法:①修饰局部变量
//      ②修饰全局变量
//      ③修饰函数


//①局部变量

void test()
{
	int a = 0;
	a++;
	printf("%d ", a);
}//这个程序如果执行起来在屏幕上会打印 十个1
//局部变量a每次进test这个函数是创建,出这个函数时销毁
//每次a都创建为0,然后++,为1
//而你想要的是1 2 3 4 5 6 7 8 9 10
//
//void test()
//{
//	static int a = 0;
//	a++;
//	printf("%d ", a);
//}//这样打出来的就是1 2 3 4 5 6 7 8 9 10    上面void函数↑改进版
//
   *所以在局部变量中 static的作用是延长局部变量的生命周期,它保留了上一次局部a的值
局部变量是放在内存的栈区的,它进入作用域创建,出了作用域就释放
局部变量被static修饰后就被放在内存的静态区了
而放在静态区的数据创建后,直到程序结束才释放
因为储存位置的差异,使得执行的效果不一样
注:局部变量被static修饰是不影响作用域的
//
//int main()
//{
//	int i = 0;
//	while (i < 10)
//	{
//		test();
//		i++;
//	}
//	return 0;
//}


//②全局变量

//extern int g_val;
//extern int g_val1;
//int main()
//{
//	printf("%d\n", g_val);
//	printf("%d\n", g_val1);
//	return 0;
//}//在另一个源文件(2022.11.2'')定义的g_val=2022用extern在这里输出是没有问题的
但用了static的g_val1就不行
因为全局变量本身是具有外部链接属性的
在A文件中定义的变量,在B问了中可以通过【链接】使用
但是如果全局变量被static修饰,这个外部链接属性就改变了
变成了内部链接属性
//当某个全局变量你想自己独吞的时候可以考虑static
   *所以在全局变量中,static的作用是将全局变量的外部连接属性变成内部链接属性
最终使得全局变量的作用域变小


//③修饰函数

声明外部函数
//extern int Add(int x, int y);
//extern int Average(int x, int y);
修饰函数
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int c = Add(a, b);
//	int d = Average(a, b);
//	printf("%d\n", c);
//	printf("%d\n", d);
//	return 0;
//}//发现函数和全局变量是非常相似的
同理,函数本身具有外部链接属性的
被static修饰后,外部连接属性变成了内部链接属性
使得这个函数只能在自己所在的源文件内部使用,其他源文件无法使用
static限制了被修饰函数的作用域
 另外函数是没有生命周期的,这点和全局变量不一样
想独吞此函数时可以考虑


//‘#define’ 的作用!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 用来定义常量和宏
//
定义常量
//
//
#define M 100
int main()
{
	int a = M;
	printf("%d\n", M);
	printf("%d\n", a);
	return 0;
}
//
//
//
定义宏
//
//
Max(int x, int y)
{
	return (x > y ? x : y);
	//↑的意思是
	//if(x>y)return x;
	//else return y;
}
我们可以写出一个宏与上面的函数非常相似
//
//#define MAX(x,y) (x>y?x:y)//与函数的区别就是参数不需要给定类型,还有函数体的差异
       名字 参数  宏体
一般来说函数是用来处理比较复杂的内容
宏一般用来处理比较简单的内容
//#define ADD(x,y) ((x)+(y))
//
//
//int main()
//{
//int a = 10;
//int b = 20;
int m = Max(a, b);
//int n = MAX(a, b);//宏的作用就是这行代码会被替换为 int n=(a>b?a:b);宏体替换
//int k = ADD(a, b);
printf("%d\n", m);
//printf("%d\n", n);
//printf("%d\n", k);
//return 0;
//}

Guess you like

Origin blog.csdn.net/outdated_socks/article/details/127664569