一个程序搞懂C语言带返回值的函数的调用以及静态变量的意义—C语言学习笔记
前言
今天学着STM32,突然遇到一个问题让我困惑不已,我发现32里面好多代码使用的是C语言中的静态变量,我去看了看相关的32视频,也翻了翻C语言的相关书籍,没怎么理解,书里和视频里说的都是静态变量是函数中的永久变量,而且可以保留参数值,使得下一次调用该函数时保留静态变量定义的值,刚好我对带返回值的函数调用不怎么理解,于是编了个程序来加深理解。
#include<stdio.h>
int getValue(void)
{
int i;
static int flag = 1; //getValue函数中的内部静态变量,作用于整个函数
for (i = 0; i < 5; i++)
{
flag++;
}
printf("%d\n", flag);
return flag;
}
int main(void)
{
int m,n;
m = getValue(); //首先执行getValue(),再把getValue()的返回值给m
n = getValue(); //执行getValue(),再把getValue()的返回值给n
printf("%d %d\n", m,n);
getchar();
getchar();
}
代码解释
首先可以看出,我在主函数之前定义了一个getValue()函数,注意在函数里我用的static静态变量定义并赋值的flag,然后可以看到每次调用这个getValue()函数,程序都可以打印输出flag的值,我这样做是为了验证flag的参数保留特性(就像之前说的连续调用该函数时的参数保留),而我又不太明白带返回值的函数如何连续进行函数调用(当然不考虑参数情况)。不带返回值的函数连续调用我知道(暂不考虑参数情况),就是
函数名();
函数名();
那么带返回值的函数值的连续调用呢,简单翻了翻书没找到答案,不妨来想一下,已经知道了带返回值函数的调用一般是首先在函数中return一个值,再将函数的返回值赋值给一个变量,格式如下:
int m;
m=int 函数名();//假设函数返回值为int型
那么相对应的调用两次呢,就像我的代码里的那样调用两次(加了个n);这个时候输出m,n,若m等于赋值过来的返回值6,而根据static静态变量的参数保留特性(具体解释是再次调用该函数时此静态变量的参数值在内存中保留,不会被释放,而且会跳过再次调用该函数里的那个静态变量定义赋值),那么flag会在6的基础上再加5,为11,那么如果我的n的值是11,即验证成功,答案果真是这样
同时惊喜的发现原来getValue()函数也运行了,我之前一直认为带返回值函数的调用只是把返回的那个值赋给另一个变量,现在发现并不是这样,那么代码的运行顺序是
1.执行getValue(),打印flag的值为6;
2.把getValue()的返回值给m,此时m=6;
3.执行getValue(),打印flag的值为11;
4.把getValue()的返回值给n,此时getValue()的返回值发生变化,n=11;
5.打印m,n的值
我又试了一下将static注释掉,果然结果如下
至此,文章结束,这是本博主的第一篇博客,博主只是个编程小白,有不对的地方可以指出,大家一起交流一起进步!