例如,在 for 循环中定义了一个名为“character”的
char
。我可以在 for 循环之外使用 char
吗?
代码:
#include <iostream>
int main()
{
for(int i = 0; i < 5; i++)
{
char character = 'a'; // Char defined in for loop
}
std::cout<<character; // Can this be made valid?
return 0;
}
是的,您可以在 C++11 及更高版本中使用 lambda 间接执行此操作:
#include <iostream>
#include <functional>
int main()
{
std::function<char()> fun;
for(int i = 0; i < 5; i++)
{
char character = 'a'; // Char defined in for loop
fun = [=](){ return character; };
}
std::cout << fun() << std::endl;
return 0;
}
外部作用域无法访问
character
,但是可以调用在该作用域中捕获的 lambda,并且该 lambda 的主体在作用域中具有 character
,并且可以为我们返回它。
在具有真正 lambda 的语言中,lambda 将访问实际的
character
变量;在该范围内创建的原始版本。在 C++ 中,=
中的 [=]
告诉 lambda 通过复制它们来捕获它正在引用的局部变量。因此 return character
实际上并不是访问原始的 character
(由于块终止,它不再存在),而是 lambda 对象携带的副本。
不。在循环或函数内部定义的变量的范围就在该循环或函数内。
如果您想要一个变量,您可以在循环中设置一个值,但也可以访问循环外部,您可以创建一个全局变量(或只是一个具有更广泛范围的变量)。只需在作用域循环之外定义变量并将其设置为循环中所需的值即可。
不。因为循环内声明的变量具有局部作用域,即只能在循环内访问它
不,如果变量的定义在循环内部,则不能在循环外部使用它
NO 为“在某个范围内声明的变量永远不能在该范围之外使用”。永远记住这一点!
如果使用 Microsoft Visual C++ 编译它,则可以添加选项 /Zc:forScope- 以禁用 for 循环范围的一致性。
此示例代码是从 MSDN 链接复制的。
// zc_forScope.cpp
// compile by using: cl /Zc:forScope- /Za zc_forScope.cpp
// C2065, D9035 expected
int main() {
// Compile by using cl /Zc:forScope- zc_forScope.cpp
// to compile this non-standard code as-is.
// Uncomment the following line to resolve C2065 for /Za.
// int i;
for (int i = 0; i < 1; i++)
;
i = 20; // i has already gone out of scope under /Za
}