局部静态变量如何在方法中工作?

如何解决局部静态变量如何在方法中工作?

下面是我的代码:

//main.c

int f()
{
    static int x = 0;
    x += 1;
    return x;
}

int main()
{
   f();
   printf("%d",f());
}

,输出为2

我知道静态变量将保持状态,但是由于我两次调用f(),因此每次x首先设置为0(static int x = 0;),然后再设置1,然后输出即可不管我打1多少次,都应该是f()

解决方法

static变量不仅持久存在,而且仅初始化一次,因此,x不是“ 每次设置为0” ,它仍然是1在第二次通话中,然后递增。确实如此

static int x = 0;  // x is initialized once only

有很大不同
static int x;
x = 0; // x is set to 0 with every call
,

每次x设置为0

否,您正在错误地阅读代码。这里的=并不表示赋值,而是表示初始化,因为它是声明的一部分。变量的初始值显式指定为0。静态变量在程序执行期间仅初始化一次。如果它们的声明出现在函数内,则不会改变该行为。

此外,静态变量的初始化程序必须是常量表达式(可以在编译时将其评估为已知值的表达式)。这意味着实际上,实现无需引入代码即可在函数内部进行任何初始化。该值可以在程序启动时简单地加载到变量的存储中。

,

您对f()进行了两次调用,x具有静态存储持续时间,其生存期是程序的整个执行过程。这就是为什么打印2而不打印1的原因。

,

...,但是由于我两次致电f(),因此每次x首先设置为0static int x = 0;。 ..“

不。每次调用x时,0均未设置为f

static变量在第一次调用定义它们的函数时仅初始化一次。

auto数学变量相比,特殊之处在于分配的内存对象一直保留到程序结束。

在对函数x的不同调用之间,对象和f的值保持不变。因此,x在每次调用该函数时都会增加一,而无需重置为曾经初始化的值。

// Calls to f() in order
f();         // value of x at the end of the function: 1
f();         // value of x at the end of the function: 2
f();         // value of x at the end of the function: 3
f();         // value of x at the end of the function: 4
// and so on.

因此,当您两次调用f()时,函数返回时2x的正确值。


旁注:

  • 0的显式初始化是多余的。 static变量默认情况下初始化为0

  • C中函数的参数列表定义/声明不应遗漏。代替int f(),写int f(void)int main()也应编辑为int main (void)int main()已过时。

,

静态变量也可以在本地范围内声明。 static 持续时间 表示对象或变量是在程序启动时分配,在程序结束时释放。from here

因此,对于您的示例程序而言,2是正确的:

以下示例代码以及顶部的语句说明了原因:

首次通话:

static int x = 0;  // unlike non-static variables,initialization is executed 
                   // only once on 1st call to function.
                   // Also unlike non-static,local variables,locally created static 
                   // variables are initialized to 0 automatically  
                   // making the explicit assignment to 0 unnecessary. 
                   // (although still a good habit. :)) 
...
x++; //x==1

第二次通话:

static x = 0 //skipped 
...
x++; //x==2

第3次通话:

static x = 0 //skipped 
...
x++; //x==3

依次类推,直到程序结束...

(已将x += 1;替换为惯用的快捷方式语法:x++;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res