我们在之前用代码判断过是否为闰年,那么我们现在来尝试下输入年和月,来判断有多少天。(假设闰年时2月都是29天)
演示如下:
int year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
return 1;
else
return 0;
}
int get_days_of_month(int y, int m)
{
int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int day = days[m];
if (year(y) && m == 2)
day += 1;
return day;
}
#include
int main()
{
int y = 0;
int m = 0;
scanf("%d %d", &y, &m);
int d = get_days_of_month(y, m);
printf("%d\n", d);
return 0;
}
上述代码在get_days_of_month函数中调用了year函数,这样就完成了函数的嵌套调用,在year函数中我们让其的返回类型为int,当输入是润年就返回1,不是就返回0,这个返回值在get_days_of_month函数中if语句中成为表达式,我们知道&&的两端表达式只要有一个为假就为假。year函数返回值为0时表达式为假就不会进入if语句这样的话,此时的天数就不会加一。就完成了天数的获得,然后再在main函数中调用get_days_of_month函数即可。
函数的链式访问其实就是将一个函数的返回值作为另一个函数的参数进行计算。
例如:
#include
#include
int main()
{
int arr1[] = { 1,2,3,4,5 };
printf("%zd",sizeof(arr1));
return 0;
}
在上述的代码中我们将sizeof库函数的返回值作为printf库函数的参数。
printf的返回值是打印在屏幕上的个数。
#include
int main()
{
int arr1[] = { 1,2,3,4,5 };
int t=printf("%zd",sizeof(arr1));
printf("\n");
printf("%d",t);
return 0;
}
这个结果为多少?大家思考一下。
答对了吗?答案是2,因为打印在屏幕上的字符位数为2.
当我们加上\n和空格会怎样呢?
#include
int main()
{
int arr1[] = { 1,2,3,4,5 };
int t=printf("%zd\n ",sizeof(arr1));
printf("\n");
printf("%d",t);
return 0;
}
此时的结果又为什么呢?
其实转义字符和空格也算,虽然在屏幕上看不出来但是也会算位数。
在我们自定义函数时,我们都会习惯性的将函数写在mian函数的上放,其实如果我们将函数写在main函数的下方虽然也可以运行但是回警告说该函数未定义。那么什么是函数定义,我们创建的整个函数就是函数定义,但是函数声明就只需要交代函数的返回类型、函数名和参数类型(函数的名字可以省略)。
例如:int Add(int x ,int y)就是一个函数声明。
extern关键词
它是用来声明外部符号的。,我们也可以用它来声明外部函数,我们一般创建一个一个项目在上面直接写代码,但是优秀的程序员都会懂得隐藏代码,它们会创建几个项目,将函数定义写在一个源文件上test.c,将函数声明写在另一个头文件上test1.h。然后再次创建add.c调用时在main函数前#include"test.h"就可以用该函数了。假如在test.c上写了一个全局变量 int a=2023;
我们在想用的时候,假如要在add.c上使用,只需要extern int a;就可以用了。
在学习static修饰变量前,我们还需要了解一个知识——作用域,和生命周期。
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效(可用)的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是变量所在的局部范围。
2. 全局变量的作用域是整个⼯程(项目)。
生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
1. 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域生命周期结束。
2. 全局变量的生命周期是:整个程序的⽣命周期。
当我们了解了这些知识后就可以用static修饰变量了,static是静止的意思,当我们用static修饰局部变量时,可使其生命周期变长,但是作用域不变,还是那个局部,本质上是影响了变量的储存类型。如果我们用其修饰函数的话,也会相应的只能在其文件内部使用,即使在其他源文件进行声明也不能使用。
若用其修饰全局变量,就会使其作用域变小,只能在自己创建的文件使用。
我们知道内存中分为栈区、堆区、静态区。
栈区:用来存放局部变量的。
堆区:动态内存管理。
静态区:存放全局变量。
如果我们只想要一个文件在此文件中使用,那我们就可以用static进行修饰。