案例分析
看如下代码,思考一下,每次打印出来的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函数中,当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量。
- "::"这个符号,可以直接来操作全局变量的。