变量提升与编程语言其他方面之间的交互[关闭]

问题描述 投票:0回答:1

以下 Python 程序 A 按预期输出

1
,而以下 Python 程序 B 则引发未绑定局部变量
x
错误,与直觉相反。

  • 方案A:
def f(): print(x)
x = 1
f()
  • 方案B:
def f(): print(x); x = 2
x = 1
f()

Javascript 具有完全相同的行为。

  • 方案A:
function f() { console.log(x); }
let x = 1;
f();
  • 方案B:
function f() { console.log(x); let x = 2; }
let x = 1;
f();

但是,C++ 在这两种情况下都会输出

1
,正如预期的那样。

  • 方案A:
#include <iostream>
int x;
void f() { std::cout << x; }
int main() { x = 1; f(); return 0; }
  • 方案B:
#include <iostream>
int x;
void f() { std::cout << x; int x = 2; }
int main() { x = 1; f(); return 0; }

所以所有程序A都会输出

1
。一方面,Python 和 Javascript 与 C++ 之间的程序 B 之间的差异是由于它们不同的范围规则造成的:在 C++ 中,变量的范围从其声明开始,而在 Python 和 Javascript 中,它从声明变量的块的开头开始。因此,在 C++ 中,函数
x
中的打印变量
f
解析为全局变量
1
的值
x
,因为它是执行时上下文中的唯一变量。在 Python 和 Javascript 中,函数
x
中的打印变量
f
解析为空,并引发未绑定局部变量
x
错误,因为局部变量
x
在执行时已经在上下文中,因此它屏蔽了全局变量
x 
尚未绑定到值
2
。 Python 和 Javascript 的这种违反直觉的行为也称为“变量提升”,因为它在块的开头“提升”变量“声明”(但不是定义)。 变量提升可能与其他编程语言设计决策相互作用,这导致一些语言选择使用它,而另一些语言则不选择。这些互动是什么?

这更多的是语言的产物,而不是面向程序员的功能。

javascript python c++ scope hoisting
1个回答
1
投票

如果您确实需要的话,这确实允许 C++ 适应更小的内存占用。否则没有太多理由考虑它。

从开发人员的角度来看,你有一个错误。您的

x

有 2 个含义。编程已经足够困难了,因为变量不会改变你的意义,所以我会尽可能避免。我认为在某些此类情况下 C++ 会向您发出警告。

在实践中,您会习惯这两种设置。

    

© www.soinside.com 2019 - 2024. All rights reserved.