оператор switch и оператор приращения - PullRequest
3 голосов
/ 08 марта 2011

Я написал следующий код:

int i = 0;  
switch(i++)  
{
   case 0:  
     cout << 0;  
   case 1:  
     cout << 1;
}  
cout << "\n" << i;  

Вывод кода был такой:

01  
1

Кто-нибудь может объяснить, пожалуйста, первую строку вывода?Почему печатаются 0 и 1?

Ответы [ 4 ]

18 голосов
/ 08 марта 2011

Во-первых, выражение i++ ( оператор постинкремента ) оценивается как 0 (даже если оно устанавливает значение i в 1). Поэтому внутри switch выбрана ветка case 0:.

Затем, поскольку после case 0: нет break, программа продолжает выполнение кода в метке case 1:.

Подводя итог, вы получите: 0 от первой ветви switch, 1 от второй ветви и еще 1, потому что это окончательное значение i.

7 голосов
/ 08 марта 2011

Поскольку вам нужно добавлять break после каждого случая, что предотвращает выполнение следующих операторов. Э.Г.

switch(i++)  
{
   case 0:  
     cout<<0;  
     break;
   case 1:  
     cout<<1;
     break;
}  

По общему признанию, второй перерыв является излишним, но я поставил его там только ради последовательности

2 голосов
/ 08 марта 2011

нужно поставить "перерыв"; в конце каждого дела.

0 голосов
/ 08 марта 2011
Переключатель

- странная конструкция. Это происходит от C, и Java и C # также приняли его, так что это не считается полностью "не-OO".

состояние включения, которое изменяется, является действительной концепцией ОО, но часто используется для переключения в зависимости от типа.

В частности, компилятор обычно создает таблицу «переходов», что означает, что именно блок O (1) вызывается в отличие от вложенного оператора «if». У вас может быть несколько значений (не считая значения по умолчанию), переходящих к одной и той же точке, поэтому блоки кода "сталкиваются" друг с другом, если вы явно не вставите оператор "break".

Вот как это было сделано в C и сохранено для C ++.

Что касается значения в переключателе, оно должно быть числовым, но не должно быть константой. В вашем случае i++ оценивается как 0, но увеличивает i до 1. Это хорошо определенное поведение, и здесь нет проблем с точками последовательности.

...