Рассмотрим следующий код:Каковы признаки инициализации крестов?
#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;
};
}
G ++ сетует crosses initialization of 'int r'
.my вопросы:
- Что такое
crosses initialization
? - Почему первый инициализатор
x + y
передает компиляцию, но позже не удалось? - В чем проблема так называемого
crosses initialization
?
EDIT:
Я знаю, что я должен использовать скобки, чтобы указать область r
, но я хочу знать, почему, например, почему не-POD не может быть определена в нескольких сазе переключателя.
Спасибо.
Мое понимание, учитывая приведенные ниже ответы, для пункта 3 состоит в том, что эта ошибка является чрезмерным ограничением C++. Если r не используется после метки, нет никакого влияния (даже если в примере здесь используется r, его можно удалить в случае 2, и компилятор даст ту же ошибку). Лучшее доказательство состоит в том, что оно разрешено в C и даже в C11. – calandoa
Возможный дубликат [Error: Jump to case label] (http://stackoverflow.com/questions/5685471/error-jump-to-case-label) –