C++ 交叉初始化的迹象是什么?
考虑以下代码:C++ 交叉初始化的迹象是什么?,c++,initialization,C++,Initialization,考虑以下代码: #include <iostream> using namespace std; int main() { int x, y, i; cin >> x >> y >> i; switch(i) { case 1: // int r = x + y; -- OK int r = 1; // Failed to Compile
#include <iostream>
using namespace std;
int main()
{
int x, y, i;
cin >> x >> y >> i;
switch(i) {
case 1:
// int r = x + y; -- OK
int r = 1; // Failed to Compile
cout << r;
break;
case 2:
r = x - y;
cout << r;
break;
};
}
#包括
使用名称空间std;
int main()
{
int x,y,i;
cin>>x>>y>>i;
开关(一){
案例1:
//int r=x+y;--正常
int r=1;//编译失败
cout您应该将案例的内容放在括号中以赋予其作用域,这样您就可以在其中声明局部变量:
switch(i) {
case 1:
{
// int r = x + y; -- OK
int r = 1; // Failed to Compile
cout << r;
}
break;
case 2:
...
break;
};
开关(一){
案例1:
{
//int r=x+y;--正常
int r=1;//编译失败
cout具有int r=x+y;
的版本也不会编译
问题是,r
可能在不执行其初始值设定项的情况下进入作用域。如果完全删除初始值设定项,代码将可以正常编译(即,该行将读取int r;
)
你能做的最好的事情就是限制变量的作用域,这样你就能让编译器和读者都满意
switch(i)
{
case 1:
{
int r = 1;
cout << r;
}
break;
case 2:
{
int r = x - y;
cout << r;
}
break;
};
开关(一)
{
案例1:
{
int r=1;
cout可以转移到块中,但不能以通过初始化绕过声明的方式。从具有自动存储持续时间的局部变量不在范围内的点跳到其在范围内的点的程序是格式错误的,除非该变量具有POD类型并且在没有初始值设定项的情况下声明
[Example: Code:
void f()
{
// ...
goto lx; // ill-formed: jump into scope of `a'
// ...
ly:
X a = 1;
// ...
lx:
goto ly; // ok, jump implies destructor
// call for `a' followed by construction
// again immediately following label ly
}
--end example]
从switch语句的条件到case标签的转换在这方面被认为是一个跳转。我建议您在switch
语句之前升级r
变量。如果您想在case
块中使用变量,(或使用相同的变量名称但使用不同),在switch语句之前定义它:
#include <iostream>
using namespace std;
int main()
{
int x, y, i;
cin >> x >> y >> i;
// Define the variable before the switch.
int r;
switch(i) {
case 1:
r = x + y
cout << r;
break;
case 2:
r = x - y;
cout << r;
break;
};
}
#包括
使用名称空间std;
int main()
{
int x,y,i;
cin>>x>>y>>i;
//在开关之前定义变量。
INTR;
开关(一){
案例1:
r=x+y
不能,但我的G++确实允许int r=x+y
。我的G++不允许。请再次检查或升级编译器。谢谢,这对我很有帮助。我认为C编译器甚至不允许在某些代码之后声明。显然C99允许这样做…我建议用另一种方式来做。编译器不必执行无论哪种情况,“本地分配”(实际上不会)欢迎您使用堆栈溢出。您应该提供引用的源代码,这是C++ 03:67/3。它也恰好是我在回答中引用的段落。下面给出的答案,我的理解是,第3点是,这个错误是对C++的过度限制。(即使这里的示例使用r,也可以在案例2中删除它,编译器也会给出相同的错误)。更好的证明是,在C中,甚至在C11中,都允许使用r