简单了解EOF,static,#define

本文深入探讨了C语言中的关键概念,包括如何使用EOF判断输入结束、static关键字的多种用途以及预处理器指令#define的应用技巧。通过具体示例展示了这些概念的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值