全局变量与局部变量优先级调用的问题—C/C++程序基础(二)

本文深入探讨C++中局部变量与全局变量的区别,特别是在函数调用中的表现。通过具体代码示例,分析了不同情况下变量的作用域及引用规则,揭示了::操作符在访问全局变量中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例分析

看如下代码,思考一下,每次打印出来的value值是多少呢? 

#include<iostream>
#include <stdio.h>

int value = 5;

void printvalue()
{
	printf("value = %d\n", value);
};

int main()
{
	printvalue();
	printf("value = %d\n", value);

	printf("****************\n");

	int value = 1;
	printvalue();
	printf("value = %d\n", value);

	printf("****************\n");

	::value = 2;
	printvalue();
	printf("value = %d\n", value);
	

	system("pause");
	return 0;
}

运行结果: 

 对上面的代码分析一下,代码的逻辑是,先在main函数之外,定义了一个全局变量value,值为5。当主函数运行的时候,通过编写的printvalue()函数和通用的打印函数printf函数直接调用,得到的打印结果是一致的,都是5,这个地方符合常识,没啥可以说的,接着往下看。

下面我又重新设置了一个局部变量,也是value,值设置为1,再调用刚才的那两个函数,会发现,结果变了,用 printvalue()函数打印的结果为5(打印的是全局变量的值),用printf函数打印的结果为1(打印的是局部变量的值)。有点违背常识了,为啥这俩打印的结果不一样了呢?

那这是为什么呢?我抱着尝试的态度,更改了一下定义全局变量的位置,把原来“int value = 5;”这条语句,放在了printvalue()函数定义的后面,再尝试运行一下,发现,竟然报错了!

根据出现的这种情况,就可以大胆的进行推断了,首先,要指明的是printvalue()函数的定义方式是有错误的,因为它没有传入参数,一切的错误都起源于这里,按照编译器的正常处理顺序,应该是这样的,在运行的时候,遇到一个函数定义printvalue(int value),会先进行初始化,函数定义中有写明输入的参数,编译器会把存放这个参数内容的空间腾出来,然后,等主调函数中真用到了 这个函数的时候,会把需要的值给填进去用,这种机制非常的稳定且高效。

但是,如果定义的函数没有填参数,就造成了最开始的程序出现的问题那样,首先,定义了一个全局变量,value,并填进去为5的值,接着,到了定义printvalue()这个函数的地方,定义的时候发现这个函数没有规定输入参数,但函数体中有用到一个叫value的变量,回想刚才刚刚的确定义了一个也叫value的东东,正好就给填进去吧!于是,原先,定义好的全局变量value,就被printvalue()绑定了,

所以,当主调函数中,用到了printvalue()的时候,调用的就都是全局变量value了。

这也就解释通了,为啥刚才把定义全局变量value的那一行语句,移到了printvalue()函数的下面,就出现报错的问题了,因为在初始化printvalue()的时候,编译器不知道它里面的说的value到底是个啥,该分配多少内存,该存入啥值,于是就报错了!

那为什么普通调用printf函数的时候,调用的是局部变量的呢?这是因为在main函数中,当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量。

再接着,我通过“::value = 2”,问这样操作的,更改的是全局变量下的value值,还是局部变量下的value值呢?答案是,全局变量下的。可以看出"::"这个符号,是直接来操作全局变量的。

经验总结

  • C++中定义的函数,必须有输入参数(或者说是,形参列表)。
  • 在main函数中,当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量。
  • "::"这个符号,可以直接来操作全局变量的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值