Вопрос C++ кто то сможет объяснить, почему конструкция switch срабатывает не по плану?

Регистрация
26 Окт 2013
Сообщения
86
Репутация
0
Спасибо
0
Монет
0
#include <iostream>

using namespace std;



int main(int argc, char** argv) {



setlocale(LC_ALL, "Rus");

int x,y,s;

cout<<"Введите координату x:";

cin>>x;

cout<<"Введите координату y:";

cin>> y;

switch(x*y)

case 1: {

x*y <= 12;

cout<<"Эти координаты нам подходят!";

break;

case 2:

x*y >= -12;

cout<<"Эти координаты нам подходят!";

break;

}



cout<<"Yes"<<endl;



system("Pause");

return 0;

}



Вот такой не сложный код, вопрос в том, что конструкция switch срабатывает только если вводить данные 1 и 2 или 2 и 1, хотя в условии стоит до 12. я пробовал повышать ещё. а при вводе 3 и 4 не срабатывает, почему?
 
просто убериеё, она там нах не нужна
 
Итоговый код:

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
setlocale(LC_ALL, "Rus");
int x,y,s;
cout<<"Введите координату x:";
cin>>x;
cout<<"Введите координату y:";
cin>> y;
switch(x*y) {
case 1: {
if (x*y <= 12) {
cout<<"Эти координаты нам подходят!";
}
break;
}
case 2: {
if (x*y >= -12) {
cout<<"Эти координаты нам подходят!";
}
break;
}
default: {
cout<<"Эти координаты нам не подходят!";
break;
}
}
cout<<endl;
system("Pause");
return 0;
}
 
Ты же указал в коде.
если x * y равно case 2: то исполняй, и так же про 1
 
Ты неправильно понимаешь суть инструкции switch. switch ( )
{
case :

case :

...
} В зависимости от ЗНАЧЕНИЯ выражения управление передаётся на метку case с этим значением. Обрати внимание, что это именно передача управления (goto), то есть после выполнения <инструкции 1> будут выполнены и <инструкции 2>. Чтобы этого избежать, в конце <инструкции 1> ставят break;

Теперь смотрим на твой код. switch(x*y)
case 1:
{
...
break;
case 2:
...
break;
} Прежде всего обращу внимание на странное расположение фигурных скобок. Это работает ТОЛЬКО потому, что case является меткой, то есть не влияет на группировку операторов. Общепринято такое расположение: switch(x*y)
{
case 1:
...
break;
case 2:
...
break;
} Вычисляется x*y и в зависимости от ЗНАЧЕНИЯ выполняются инструкции соответствующей метки case. Поскольку имеются case только для значений 1 и 2, то и выполняются инструкции ТОЛЬКО если x*y равно 1 или 2.

Возникает вопрос, как добиться того, что хочет автор. Инструкция switch для этого совершенно не подходит, потому что у case должно быть константное выражение, а перебирать все возможные значения x*y не представляется возможным. Нужно использовать if: if(x*y
 
Где стоит до 12?
 
Назад
Сверху