#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;
//}
Simple understanding of EOF, static, #define
Guess you like
Origin blog.csdn.net/outdated_socks/article/details/127664569
Recommended
Ranking