javascript — переключение вариантов оператора в C ++ / JS

Просто изучая JS, имея опыт работы с C ++, C #, я попробовал это:

var userChoice=prompt("Enter 1,2 or 3");
switch(userChoice)
{
default : alert("Default case");
case '1': alert("case 1 ");
case '2': alert("case 2 ");
case '3': alert("case 3 ");}

и подобный фрагмент в C ++:

#include<iostream>
using namespace std;

int main()
{
int userChoice=1;
switch(userChoice)
{
default : cout<<"Default case ";
case '1': cout<<"case 1 ";
case '2': cout<<"case 2 ";
case '3': cout<<"case 3 ";}
return 0;
}

Выполняя оба с userChoice = 1, я обнаружил, что JSFiddle исключает регистр по умолчанию, в то время как в C ++, Ideone печатает все дела, включая одно по умолчанию. Хорошо, позвольте мне подвести итог.


JS:

1.Putting userChoice = 1, выполняет случай 1, случай 2, случай 3.

2.Putting userChoice = 2, выполняет случай 2, случай 3.

3.Putting userChoice = 3, выполняет случай 3.

4.Putting userChoice = 4/5 .., выполняет случай по умолчанию, случай 1, случай 2, случай 3.

C ++:

1.Putting userChoice = что-нибудь, он выполняет все дела!


Теперь небольшое изменение, я поставил перерыв после случая по умолчанию.
Ведущий к:

default : cout<<"Default case "; break;

Я наблюдаю за JS, все результаты одинаковы, кроме случая по умолчанию. Вместо того, чтобы выполнять все случаи, он заканчивается по умолчанию один, ну, это должно быть, потому что я использовал «Break».


Что удивительно, в C ++ (после разрыва курса):

  1. Независимо от того, какое значение я придаю userChoice, вывод — это просто регистр по умолчанию. : |

Вещи, которые меня беспокоят:

  1. Это ожидаемое поведение этих языков или они могут отличаться на разных компиляторах (для C ++).

  2. Знает ли JS позицию (я не знаю, какое слово использовать) кейса по умолчанию перед выполнением, в то время как C ++ просто следует по коду, пока не достигнет разрыва (или может быть возвращен или что-то еще)?

И да, я знаю, что мне следует больше использовать операторы break … но все же … из любопытства!

2

Решение

Вы определили переменную userChoice как имеющий тип int и инициализировал его 1.

В операторе switch есть символьные константы, которые будут преобразованы в тип int Так '1' будет эквивалентно 49, если кодировка ASCII, «2» будет равна 50 и так далее.
Так userChoice не будет равно ни одной из констант, и управление будет передано метке default и все операторы после этой метки будут выполняться последовательно, потому что нет никаких операторов перехода

#include<iostream>
using namespace std;

int main()
{
int userChoice=1;
switch(userChoice)
{
default : cout<<"Default case ";
case '1': cout<<"case 1 ";
case '2': cout<<"case 2 ";
case '3': cout<<"case 3 ";}
return 0;
}

Если вы измените код следующим образом

#include<iostream>
using namespace std;

int main()
{
int userChoice=1;
switch(userChoice)
{
default : cout<<"Default case "; break;
case '1': cout<<"case 1 "; break;
case '2': cout<<"case 2 "; break;
case '3': cout<<"case 3 "; break;}
return 0;
}

тогда вы получите вывод

Default case

Если вы назначите 49, которое является целочисленным значением символа ‘1’ для userChoice, тогда вывод будет

case 1
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]