powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / помогите разобраться с switch case break
10 сообщений из 10, страница 1 из 1
помогите разобраться с switch case break
    #38291632
java_student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Я вот никак не могу понять, почему в этом примере
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class SomeClass {

	   public static void main(String[] args) {
		   int x = 1;
		   switch(x) {
		      case 1: System.out.println("Равно 1 ");
		      case 2: System.out.println("Равно 2");
		      case 3: System.out.println("Равно 3");
		      case 4: System.out.println("Равно 4");
		      default: System.out.println("Значение не определено");
		   }		   
	   }
	}


выводятся все 5 строк. Понятно, что это такое поведение у оператора switch, он поочередно перебирает все case и как только находит совпадение, то выполняет соответствующий ему блок, а потом без проверки на совпадение выполняет все последующие блоки. Но зачем так делать? Это же нелогичное поведение оператора. Логичнее было бы ввести какую-то опцию, которая указывала бы switch'у, что текущую строку нужно тоже выполнить, даже если и нет соответствия в текущем case, чем принудительно указывать в каждом блоке break. Что-то типа такого
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class SomeClass {

	   public static void main(String[] args) {
		   int x = 1;
		   switch(x) {
		      case 1: System.out.println("Равно 1 ");
		      case 2 or PrevTrue: System.out.println("Равно 2");
		      case 3 or PrevTrue: System.out.println("Равно 3");
		      case 4: System.out.println("Равно 4");
		      default or PrevTrue: System.out.println("Значение не определено");
		   }		   
	   }
	}


Я понимаю, что никто ничего переделывать не будет и что просто нужно с таким поведением смириться, но может быть я чего-то не знаю? Почему такое поведение switch мне кажется абсолютно нелогичным, может есть какие-то ситуации, в которых это оправдано?
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291662
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jаva_student,

yчи лучше Pascal и Delphi
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291665
java_student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
J.Serge,

А по существу сказать нечего? Я не просил совета, что мне учить.
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291666
JulT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291670
java_student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JulT,

The break statements are necessary because without them, statements in switch blocks fall through: All statements after the matching case label are executed in sequence, regardless of the expression of subsequent case labels, until a break statement is encountered.
Вот именно это regardless и непонятно. Использование break выглядит костылем в данном случае. Не могу понять, чем было оправдано такое поведение, в каких случаях это может понадобиться.
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291675
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
java_studentВот именно это regardless и непонятно. Использование break выглядит костылем в данном случае. Не могу понять, чем было оправдано такое поведение, в каких случаях это может понадобиться.
Синтаксис Java наследует синтаксис С++. Разбираться почему было сделано пару десятков лет назад достаточно бесполезно. В Java и без этого косяков масса. Если что-то сделано в Java так а не иначе, это не значит что данный варивнт является оптимальным для разработчиков. Возможно он был просто проще для разработчиков компилятора.
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291676
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
java_studentJ.Serge,

A по существу сказать нечего? Я не просил совета, что мне учить.

A чего ты хочешь услышать? switch в java работает именно так: нужен явный break.
В Pascal и Delphi case работает иначе: там неявный break после окончания каждого блока кода по метке.
Примерно так, как тебе хочется.

Да, кстати, для второго примера, можешь првести ожидаемое поведение (вывод в System.out) для x = 1, x = 2, x = 3, x = 5 ну и x = 5?
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291678
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291688
java_student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Большое спасибо! Именно это и интересовало.
...
Рейтинг: 0 / 0
помогите разобраться с switch case break
    #38291696
java_student
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
J.SergeA чего ты хочешь услышать? switch в java работает именно так: нужен явный break.
В Pascal и Delphi case работает иначе: там неявный break после окончания каждого блока кода по метке.
Примерно так, как тебе хочется.

Я хотел услышать вот это (еще раз спасибо Blazkowicz ). Теперь хоть понятно, почему такое поведение у switch. То, что мне казалось нелогичным, теперь имеет нормальное объяснение. Java унаследовала такое поведение от C, в котором switch был реализован как GOTO к нужной метке без обратного перехода к окончанию switch. Как-то так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
if (i == 1)
  goto N1;
else if (i == 2)
  goto N2;
else if (i == 3)
  goto N3;
else if (i == 4)
  goto N4;
else 
  goto NDefault;

N1: ...
N2: ...
N3: ...
N4: ...
NDefault: ...


Понятно, что при таком подходе нужно использовать break (который не даст выполняться следующим строкам кода).
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / помогите разобраться с switch case break
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]