C++自定义division函数返回0,main函数中的x变量该如何声明?
你给出的代码如下:
#include <iostream> using namespace std; int division(int c, int d); int x = 2; int y = 2; int division(int c, int d) { return (c/d); } int main() { cout << "Hello World!\n"; int x = division(x,y); cout << x; return 0; }
你观察到的异常是C++的名字隐藏规则和变量声明点规则共同作用的结果:
- 名字隐藏规则:如果局部作用域内声明了和全局变量同名的变量,该作用域内这个名字默认指向局部变量,同名全局变量会被隐藏。
- 变量声明点规则:C++标准规定,局部变量的声明点位于完整声明符之后、初始化表达式之前。你写
int x = division(x,y)时,解析division的参数x的阶段,名字查找已经匹配到了刚声明的局部x,不会再指向全局x。 - 此时局部
x还没有完成初始化,存储的是不确定的垃圾值,访问未初始化变量属于未定义行为,程序运行结果没有标准保障。
对应三个现象的具体解释:
- 原代码输出0:
division的第一个参数是未初始化的局部x的垃圾值,第二个参数y没有被隐藏,指向值为2的全局y。你本次运行时局部x的垃圾值刚好为0,0/2=0,赋值给局部x后输出结果就是0。 - 删除
int关键字后输出1:删除int后没有声明新的局部x,division的参数x指向值为2的全局x,2/2=1,赋值给全局x后输出结果符合预期。 - 保留
int关键字但传入x,x作为参数时输出1:两个参数都是同一个未初始化的局部x,同一个变量此时的垃圾值完全相等,任意非0值除以自身的结果都是1,属于未定义行为的偶然表现,不具备可复现性。
注意:不要依赖未初始化变量的运行结果,日常编码中尽量避免局部变量和全局变量同名,可以有效规避这类隐性问题。
内容的提问来源于stack exchange,提问作者almostprettydecentcoder
相关产品推荐
相关产品推荐

