Просто изучая 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 печатает все дела, включая одно по умолчанию. Хорошо, позвольте мне подвести итог.
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.
1.Putting userChoice = что-нибудь, он выполняет все дела!
Теперь небольшое изменение, я поставил перерыв после случая по умолчанию.
Ведущий к:
default : cout<<"Default case "; break;
Я наблюдаю за JS, все результаты одинаковы, кроме случая по умолчанию. Вместо того, чтобы выполнять все случаи, он заканчивается по умолчанию один, ну, это должно быть, потому что я использовал «Break».
Что удивительно, в C ++ (после разрыва курса):
Вещи, которые меня беспокоят:
Это ожидаемое поведение этих языков или они могут отличаться на разных компиляторах (для C ++).
Знает ли JS позицию (я не знаю, какое слово использовать) кейса по умолчанию перед выполнением, в то время как C ++ просто следует по коду, пока не достигнет разрыва (или может быть возвращен или что-то еще)?
И да, я знаю, что мне следует больше использовать операторы break … но все же … из любопытства!
Вы определили переменную 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
Других решений пока нет …