c语言static在循环中使用的注意事项

admin C语言 4


是不是有朋友在循环里用 static 变量时,总遇到奇怪的问题?比如明明写的是循环累加,结果第一次运行对,第二次运行就不对了;或者想让变量每次循环都重置,可它偏不。其实啊,static 在循环里用着方便,但讲究不少,稍不注意就掉坑里。今天兔子哥就给大家说说这里面的门道,那些该注意的地方,保证你看完就明白,一起往下看吧!
循环里的 static 变量,初始化只做一次吗?
对,这是最关键的一点。平常咱们在循环里定义普通变量,比如 for 循环里写 int i = 0;,每次循环都会重新把 i 变成 0。但 static 变量不一样,它的初始化语句只在第一次进入循环时执行,后面再循环,就跳过初始化了。
看个例子:
plaintext
#include int main() {for (int i = 0; i < 3; i++) {static int count = 0; // static变量count++;printf("第%d次循环,count的值:%d\n", i+1, count);}return 0;}

运行结果会是:
第 1 次循环,count 的值:1
第 2 次循环,count 的值:2
第 3 次循环,count 的值:3
瞧见没?count 只在第一次循环时被初始化为 0,后面两次循环都直接用上次的结果加 1。要是把 static 去掉,每次循环 count 都会变回 0,三次输出就都是 1 了。这一点,新手最容易搞混,以为循环会重新初始化,结果算出来的数不对。
在循环里用 static 变量计数,要注意啥?
很多人喜欢在循环里用 static 变量做计数,比如统计循环执行了多少次,这确实方便,但有个坑得注意:程序没结束,这个计数就清不了零。
比如你写了个函数,里面有个带 static 变量的循环:
plaintext
void test() {for (int i = 0; i < 2; i++) {static int total = 0;total++;printf("total:%d\n", total);}}

第一次调用 test (),会输出 1、2;第二次调用,就会输出 3、4。因为 total 的值在程序运行期间一直存在,不会因为函数结束就清零。
所以啊,要是你想每次调用函数,循环里的计数都从 0 开始,就不能用 static,用普通变量才行。我之前就犯过这错,写了个统计点击量的函数,用 static 在循环里计数,结果第二次打开程序,计数没清零,老板还问我为啥数据不对。
在循环里误用 static,会有啥后果?
最常见的就是逻辑错误。比如你想做一个循环累加,每次循环都加上当前的 i 值,却不小心把累加的变量设成了 static:
plaintext
#include int main() {for (int i = 1; i <= 3; i++) {static int sum = 0; // 不该用static的地方用了sum += i;printf("sum:%d\n", sum);}// 这里再写个循环,sum会接着上次的加for (int i = 4; i <= 5; i++) {static int sum = 0; // 其实和上面的sum是同一个sum += i;printf("sum:%d\n", sum);}return 0;}

第一次循环输出 1、3、6;第二次循环会输出 10、15。因为两个循环里的 static sum 是同一个变量,第二个循环接着第一个的结果加。要是你本来想让两个循环各算各的,这结果就完全不对了。
还有种情况,在嵌套循环里用 static 变量,内层循环的变量值会影响到下一次外层循环,特别容易乱。所以啊,不确定要不要用 static 的时候,宁愿用普通变量,出错概率小多了。
哪些场景适合在循环里用 static?
也不是说循环里不能用 static,有些场景用着就很方便。比如:
  1. 想统计整个程序运行期间,循环总共执行了多少次。这时候用 static 变量累加,就能一直记着总数,普通变量做不到。
  2. 循环里需要一个只会初始化一次的变量,比如读取配置文件,只想在第一次循环时读一次,后面循环直接用读好的值,这时候用 static 变量存配置,能提高效率。

兔子哥平常写代码,只有确定这个变量的值需要跨循环保留时,才会在循环里用 static,不然都是用普通变量,省得给自己找麻烦。
最后想跟大家说,static 在循环里用好了是个宝,用错了就是坑。关键是记住它 “只初始化一次,值会一直保留” 这个特点。用之前多想想:我需要这个变量跨循环保留值吗?如果不需要,就别用 static。刚开始不熟练的时候,多写几个例子跑跑,看看结果和自己想的一样不一样,慢慢就有感觉了。希望这些能帮到你,有啥不懂的,随时来问兔子哥!

标签: 再循环 第一次

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~