找回密码
 立即注册
查看: 61|回复: 3

非static变量居然能累加了

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 2025-4-22 20:11:55 | 显示全部楼层 |阅读模式

rt!真是见鬼了。i2居然是2!
截图202504222011134686.jpg

程序如下
  1. #include "stdio.h"
  2. unsigned char f1(void);
  3. unsigned char f1_static(void);
  4. unsigned char f1(void){
  5.         unsigned char i;
  6.         i++;
  7.         return i;
  8. }
  9. unsigned char f1_static(void){
  10.         static unsigned char i=0;
  11.         i++;
  12.         return i;
  13. }
  14. int main(){
  15.         unsigned char i1,i2,i3,i4;
  16.         i1=f1();
  17.         i2=f1();
  18.         i3=f1_static();
  19.         i4=f1_static();
  20.         printf("%d,%d,%d,%d",i1,i2,i3,i4);//1,2,1,2
  21.        
  22.         return 0;
  23. }
复制代码


回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-22 20:13:00 | 显示全部楼层
在您提供的代码中,观察到非static变量i在函数f1中似乎能够累加,这实际上是由于未初始化变量的行为导致的。以下是对代码的详细分析:

1. 非static变量的行为
在函数f1中,变量i被声明为unsigned char类型,但未进行初始化。在C语言中,未初始化的局部变量(非static变量)的值是未定义的,这意味着它的值可能是任意的,取决于内存中的残留数据。
  1. c
  2. unsigned char f1(void){
  3.     unsigned char i;  // 未初始化
  4.     i++;
  5.     return i;
  6. }
复制代码

当f1被调用时,i的值是未定义的。如果内存中的残留数据恰好为1,那么i++后i的值将变为2。因此,i1和i2的值可能分别为1和2,但这并不是因为i在函数调用之间保持了状态,而是因为未初始化的变量行为。

2. static变量的行为
在函数f1static中,变量i被声明为static类型,并且初始化为0。static局部变量在程序的整个生命周期内保持其值,即使函数调用结束,变量的值也不会被销毁。
  1. c
  2. unsigned char f1static(void){
  3.     static unsigned char i=0;  // 初始化为0
  4.     i++;
  5.     return i;
  6. }
复制代码

每次调用f1static时,i的值都会在上一次调用的基础上递增。因此,i3和i4的值分别为1和2,这是预期的行为。

3. 代码输出分析
在main函数中,i1和i2分别调用了f1,而i3和i4分别调用了f1static。根据上述分析,输出结果1,2,1,2可以解释为:
i1和i2的值取决于未初始化变量i的初始值,可能分别为1和2。
i3和i4的值分别为1和2,因为static变量i在函数调用之间保持了状态。

4. 代码改进建议
为了避免未初始化变量带来的未定义行为,建议在声明变量时进行初始化。例如,可以将f1函数修改为:
  1. c
  2. unsigned char f1(void){
  3.     unsigned char i = 0;  // 初始化为0
  4.     i++;
  5.     return i;
  6. }
复制代码

这样,每次调用f1时,i的值都会从0开始递增,输出结果将更加可预测。

5. 总结
在C语言中,未初始化的局部变量的值是未定义的,可能导致不可预测的行为。而static局部变量在程序的整个生命周期内保持其值,适合用于需要在函数调用之间保持状态的场景。通过合理初始化变量,可以避免未定义行为,提高代码的可靠性和可维护性。

希望以上分析对您理解代码行为有所帮助。如有进一步问题,欢迎继续讨论。

[本文内容由国芯人工智能辅助生成,仅供参考]
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-22 20:52:46 | 显示全部楼层
截图202504222052304355.jpg
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
三天不学习,赶不上刘少奇~
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:143
  • 最近打卡:2025-04-29 09:29:30

31

主题

148

回帖

980

积分

高级会员

积分
980
发表于 2025-4-23 10:06:55 | 显示全部楼层
感谢两位指点。确实是忘记初始化变量了。。。。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:58 , Processed in 0.219371 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表