switch
От: Alexander G Украина  
Дата: 13.01.09 10:28
Оценка: -1
#include <string>
#include <iostream>

int main()
{
  std::string s = "hello";
  switch (s[0])
  {
  case 'x':
    s += ", world";
    break;
  case 'y':
  case 'h':
    std::string s;
    s += ", world";
    break;
  }
  std::cout << s << '\n';
}


Что напишет и почему?
Русский военный корабль идёт ко дну!
Re: switch
От: K13 http://akvis.com
Дата: 13.01.09 10:50
Оценка: +1
AG>
AG>  case 'h':
AG>    std::string s;
AG>    s += ", world";
AG>    break;
AG>


AG>Что напишет и почему?


Поскольку тут модифицируется локальная переменная, то объявленная до switch s останется неизменной.

А вот если case 'x': утащить вниз switch, то и не скомпилится -- нужны фигурные скобки.
Re[2]: дефект С++ ?
От: Alexander G Украина  
Дата: 13.01.09 10:54
Оценка:
Здравствуйте, K13, Вы писали:

K13>Поскольку тут модифицируется локальная переменная, то объявленная до switch s останется неизменной.


K13>А вот если case 'x': утащить вниз switch, то и не скомпилится -- нужны фигурные скобки.


Да.
А теперь вопрос:
не является ли такое выделение последнего case дефектом стандарта?
Русский военный корабль идёт ко дну!
Re[3]: дефект С++ ?
От: Аноним  
Дата: 13.01.09 11:21
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, K13, Вы писали:


K13>>Поскольку тут модифицируется локальная переменная, то объявленная до switch s останется неизменной.


K13>>А вот если case 'x': утащить вниз switch, то и не скомпилится -- нужны фигурные скобки.


AG>Да.

AG>А теперь вопрос:
AG>не является ли такое выделение последнего case дефектом стандарта?

Какое такое выделение??
Re[3]: дефект С++ ?
От: Erop Россия  
Дата: 13.01.09 12:19
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>не является ли такое выделение последнего case дефектом стандарта?


Я не знаю, что ты там считаешь за выделение, но убогость С'ишного switch'а общеизвестна...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: дефект С++ ?
От: Alexander G Украина  
Дата: 13.01.09 12:34
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я не знаю, что ты там считаешь за выделение,


ну что в последнем case можно объявлять не-POD переменные, в остальных нельзя.
Русский военный корабль идёт ко дну!
Re[5]: дефект С++ ?
От: Erop Россия  
Дата: 13.01.09 12:39
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>ну что в последнем case можно объявлять не-POD переменные, в остальных нельзя.

В этом смысле switch является близнецом-братом goto. case -- это просто метки, а switch -- это просто goto на одну из них...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: дефект С++ ?
От: Кодт Россия  
Дата: 13.01.09 13:38
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>не является ли такое выделение последнего case дефектом стандарта?


Это является дефектом языка, а с точки зрения стандарта всё довольно прозрачно.

Контекст здесь ограничен фигурными скобками (телом switch'а).
case суть метки, и даже если условное goto сделано сколь угодно умно (на хеш-таблице, на двоичном поиске, ещё бог знает как), всё равно логика исполнения тела switch остаётся последовательной.
Правила видимости переменных в теле блока с метками хорошо известны. switch им не противоречит.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[4]: дефект С++ ?
От: coba  
Дата: 13.01.09 14:06
Оценка:
Здравствуйте, Erop, Вы писали:
E>Я не знаю, что ты там считаешь за выделение, но убогость С'ишного switch'а общеизвестна...
это как раз с++ свитч
http://agilemanifesto.org/iso/ru/
Re[5]: дефект С++ ?
От: Erop Россия  
Дата: 13.01.09 14:25
Оценка:
Здравствуйте, coba, Вы писали:

E>>Я не знаю, что ты там считаешь за выделение, но убогость С'ишного switch'а общеизвестна...

C>это как раз с++ свитч

Да хрен редьки не слаще...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: дефект С++ ?
От: coba  
Дата: 13.01.09 14:40
Оценка:
Здравствуйте, Erop, Вы писали:
AG>>ну что в последнем case можно объявлять не-POD переменные, в остальных нельзя.
E>В этом смысле switch является близнецом-братом goto. case -- это просто метки, а switch -- это просто goto на одну из них...
так это и имеется в виду, что в с++ с его областями видимости подобная организация switch является атавизмом...
http://agilemanifesto.org/iso/ru/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.