Re[6]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 12:07
Оценка: -7
Здравствуйте, CEMb, Вы писали:

CEM>Как мне думается, были рассмотрены всевозможные варианты разбора ветвлений, самый часто используемый был реализован самым простым синтаксисом.


Это так нормальные языки проектируют.
Но к сишке это не относится. Вообще процесс её появления нельзя называть словом "проектировать", к сишке можно отнести только слово "была высрана".
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:07
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>естественная — та, что естественна для человека, читающего программу. если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается о ее семантике. теперь проделайте то же самое со switch/case — угу.


X>Если брать пример Ваш:

X>
X>switch (1) {
X>    case 1: std::cout << '1';
X>    case 2: std::cout << '2';
X>}
X>

X>Что тут не естественного?

о-ё. то, что читается она как "выбрать из перечисленных ниже случаев случай, подходящий под указанный", а работает совсем по-другому — нет никаких случаев, есть точка входа в тело, заключенное межу скобками после switch, потому надо было бы писать goto вместо switch и label вместо case.
Re[5]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:09
Оценка:
Здравствуйте, _hum_, Вы писали:

__>так поэтому я и обратил на эту штуку внимание только сейчас, после долгих лет знакомства, ибо всегда и всюду автоматом включался break, который делал семантику естественной. а тут решил сэкономить в угоду читабельности, и на тебе — "все, что вы знали о switch — неправда" . потому и предупреждаю других граждан


А можно реальный пример, где Вы решили сэкономить в угоду читабельности, убрав пару break.
С уважением!
Re[2]: семантика switch/case
От: Mr.Delphist  
Дата: 16.12.15 12:20
Оценка: :))
Здравствуйте, T4r4sB, Вы писали:

TB>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например

TB>
TB>case 1,3,5..8 :
TB>


Запятая уже занята для других целей

Да и вообще, читайте маны — они рулез.
Re[6]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:23
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>так поэтому я и обратил на эту штуку внимание только сейчас, после долгих лет знакомства, ибо всегда и всюду автоматом включался break, который делал семантику естественной. а тут решил сэкономить в угоду читабельности, и на тебе — "все, что вы знали о switch — неправда" . потому и предупреждаю других граждан


X>А можно реальный пример, где Вы решили сэкономить в угоду читабельности, убрав пару break.


да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

swicth(a)
{
case 1: x = 1001; break;
case 2: x = 4002; break;
};

swicth(a)
{
case 1: x = 1001; 
case 2: x = 4002; 
};

(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)
Re[3]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:25
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

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


TB>>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например

TB>>
TB>>case 1,3,5..8 :
TB>>


MD>Запятая уже занята для других целей



case {1,3,5..8} :
Re[7]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:29
Оценка:
Здравствуйте, _hum_, Вы писали:

__>да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

__>

__>swicth(a)
__>{
__>case 1: x = 1001; break;
__>case 2: x = 4002; break;
__>};

__>swicth(a)
__>{
__>case 1: x = 1001; 
__>case 2: x = 4002; 
__>};
__>

__>(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)

По Вашему мнению это один и тот же код, но на самом деле совершенно разный.
Перечитайте про абстракцию еще разок: http://rsdn.ru/forum/cpp/6281323.1
Автор: xobotik
Дата: 16.12.15


В первом случае, если а = 1, то x = 1001, если a = 2, то x = 4002.
Во втором случае, если а = 1 или а = 2, x = 4002.
(если подробнее, если а = 1, то x принимает значение 1001, затем x принимает значение 4002,
если a = 2, то x = 4002)
С уважением!
Re[3]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 12:29
Оценка: +5
Здравствуйте, Mr.Delphist, Вы писали:

MD>Запятая уже занята для других целей


Спасибо томпсону и ритчи за это!

MD>Да и вообще, читайте маны — они рулез.


Если в мане будет написано "ехать на лошади стоя очень просто — надо лишь не падать вперёд, назад, вправо и влево", то это не значит, что заставлять людей ездить на лошадях стоя — это нормально.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: семантика switch/case
От: savitar  
Дата: 16.12.15 12:33
Оценка:
Здравствуйте, _hum_, Вы писали:

__>да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

__>

__>swicth(a)
__>{
__>case 1: x = 1001; break;
__>case 2: x = 4002; break;
__>};

__>swicth(a)
__>{
__>case 1: x = 1001; 
__>case 2: x = 4002; 
__>};
__>

__>(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)

возможно вынос в отдельную ф-цию поможет, типа такого:
int get_x_from_a(int a)
{
    switch (a)
    {
    case 1: return 1001;
    case 2: return 4002;
    // и т.д.
    };
}
Отредактировано 16.12.2015 12:36 savitar . Предыдущая версия .
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:34
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

__>>

__>>swicth(a)
__>>{
__>>case 1: x = 1001; break;
__>>case 2: x = 4002; break;
__>>};

__>>swicth(a)
__>>{
__>>case 1: x = 1001; 
__>>case 2: x = 4002; 
__>>};
__>>

__>>(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)

X>По Вашему мнению это один и тот же код, но на самом деле совершенно разный.

X>Перечитайте про абстракцию еще разок: http://rsdn.ru/forum/cpp/6281323.1
Автор: xobotik
Дата: 16.12.15


X>В первом случае, если а = 1, то x = 1001, если a = 2, то x = 4002.

X>Во втором случае, если а = 1 или а = 2, x = 4002.
X>(если подробнее, если а = 1, то x принимает значение 1001, затем x принимает значение 4002,
X>если a = 2, то x = 4002)
я теперь уже знаю, что это разный код. вы спрашивали, зачем мне захотелось отказаться от break, вот я вам и привел пример, как выглядит текст с брейком и без оного.
Re[9]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:38
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__> я теперь уже знаю, что это разный код. вы спрашивали, зачем мне захотелось отказаться от break, вот я вам и привел пример, как выглядит текст с брейком и без оного.


Вы хотите, чтобы код с break и без него выполнялся одинаково? И зачем? А как тогда реализовать спуск вниз через case'ы?
С уважением!
Re[3]: семантика switch/case
От: watchmaker  
Дата: 16.12.15 12:40
Оценка: 1 (1) +2
Здравствуйте, Mr.Delphist, Вы писали:

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


TB>>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например

TB>>
TB>>case 1,3,5..8 :
TB>>


MD>Запятая уже занята для других целей :)

MD>Да и вообще, читайте маны — они рулез.

Вот как раз в манах (например, в ISO/IEC 9899:1999 в главе Language syntax summary) явно сказано, что в выражении сase 1,3,5: statement запятая не может носить смысл оператора (а чтобы носила, нужно обязательно обернуть выражение в скобки так: сase (1,3,5): statement).
Так что в теории задействовать запятую под перечисление вариантов в данном контексте можно — семантика старого кода не поменяется и ничего не сломается.
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:41
Оценка: -3 :))
Здравствуйте, savitar, Вы писали:

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


S>возможно вынос в отдельную ф-цию поможет, типа такого:

S>
S>int get_x_from_a(int a)
S>{
S>    switch (a)
S>    {
S>    case 1: return 1001;
S>    case 2: return 4002;
S>    // и т.д.
S>    };
S>}
S>


безусловно, но использовать более одного return — это моветон
Re[9]: оффтоп
От: xobotik Россия  
Дата: 16.12.15 12:44
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>безусловно, но использовать более одного return — это моветон


И когда это стало моветоном ? Можно пруфы?
С уважением!
Re[10]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:50
Оценка: :))
Здравствуйте, xobotik, Вы писали:

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


__>> я теперь уже знаю, что это разный код. вы спрашивали, зачем мне захотелось отказаться от break, вот я вам и привел пример, как выглядит текст с брейком и без оного.


X>Вы хотите, чтобы код с break и без него выполнялся одинаково? И зачем? А как тогда реализовать спуск вниз через case'ы?


я хочу решить задачу — наиболее выразительно реализовать
"если значение a совпадает с 1, то присвоить res значение 1001, если совпадает с 2, то присвоить res значение 4002, и т.д."
с точки зрения человеческой семантики это должно выглядеть в точности как
swith(a)
{
case 1: res = 1001;
case 2: res = 4002;
};

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

спуск вниз через все кейсы — это нечто ассмеблеро-подобное. используйте тогда уже сразу goto.
Re[11]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:55
Оценка: +3
Здравствуйте, _hum_, Вы писали:

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


Вы скорее всего выразили отсутствие знаний в этом вопросе. То что Вы не знаете не является не очевидным.

Для меня человеческая семантика:
swicth(a) {
    case 1: x = 1001; break;
    case 2: x = 4002; break;
};
С уважением!
Re[10]: оффтоп
От: _hum_ Беларусь  
Дата: 16.12.15 12:59
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>безусловно, но использовать более одного return — это моветон


X>И когда это стало моветоном ? Можно пруфы?


wiki/Return_statement
Languages with an explicit return statement create the possibility of multiple return statements in the same function. Whether or not that is a good thing is controversial.

Strong adherents of structured programming make sure each function has a single entry and a single exit (SESE). It has thus been argued[6] that one should eschew the use of the explicit return statement except at the textual end of a subroutine, considering that, when it is used to "return early", it may suffer from the same sort of problems that arise for the GOTO statement.

Re[10]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 13:00
Оценка:
Здравствуйте, xobotik, Вы писали:

X> А как тогда реализовать спуск вниз через case'ы?


Действительно, раз томсон и ричи реализовали этот спуск именно так, то это значит, что никаких иных способов в приниципе существовать не может и никто до иных способов никогда не смог бы додуматься
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: семантика switch/case
От: B0FEE664  
Дата: 16.12.15 13:00
Оценка:
Здравствуйте, _hum_, Вы писали:

__> если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается ...


что ось абсцисс направлена влево.
И это вы называете естественным?
И каждый день — без права на ошибку...
Re[12]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 13:00
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Для меня человеческая семантика:


Крестодеформация
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.