#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;
//}