Здравствуйте, CEMb, Вы писали:
CEM>Как мне думается, были рассмотрены всевозможные варианты разбора ветвлений, самый часто используемый был реализован самым простым синтаксисом.
Это так нормальные языки проектируют.
Но к сишке это не относится. Вообще процесс её появления нельзя называть словом "проектировать", к сишке можно отнести только слово "была высрана".
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, 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.
Здравствуйте, _hum_, Вы писали:
__>так поэтому я и обратил на эту штуку внимание только сейчас, после долгих лет знакомства, ибо всегда и всюду автоматом включался break, который делал семантику естественной. а тут решил сэкономить в угоду читабельности, и на тебе — "все, что вы знали о switch — неправда" . потому и предупреждаю других граждан
А можно реальный пример, где Вы решили сэкономить в угоду читабельности, убрав пару break.
Здравствуйте, T4r4sB, Вы писали:
TB>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например TB>
Здравствуйте, 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;
};
(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, T4r4sB, Вы писали:
TB>>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например TB>>
В первом случае, если а = 1, то x = 1001, если a = 2, то x = 4002.
Во втором случае, если а = 1 или а = 2, x = 4002.
(если подробнее, если а = 1, то x принимает значение 1001, затем x принимает значение 4002,
если a = 2, то x = 4002)
Здравствуйте, Mr.Delphist, Вы писали:
MD>Запятая уже занята для других целей
Спасибо томпсону и ритчи за это!
MD>Да и вообще, читайте маны — они рулез.
Если в мане будет написано "ехать на лошади стоя очень просто — надо лишь не падать вперёд, назад, вправо и влево", то это не значит, что заставлять людей ездить на лошадях стоя — это нормально.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, 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
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, вот я вам и привел пример, как выглядит текст с брейком и без оного.
Здравствуйте, _hum_, Вы писали:
__> я теперь уже знаю, что это разный код. вы спрашивали, зачем мне захотелось отказаться от break, вот я вам и привел пример, как выглядит текст с брейком и без оного.
Вы хотите, чтобы код с break и без него выполнялся одинаково? И зачем? А как тогда реализовать спуск вниз через case'ы?
Здравствуйте, 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).
Так что в теории задействовать запятую под перечисление вариантов в данном контексте можно — семантика старого кода не поменяется и ничего не сломается.
Здравствуйте, 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.
Здравствуйте, _hum_, Вы писали:
__>но в си оказалось, что эта конструкция закреплена за совсем другой семантикой. вот и высказываю свое удивление и недовольство
Вы скорее всего выразили отсутствие знаний в этом вопросе. То что Вы не знаете не является не очевидным.
Для меня человеческая семантика:
swicth(a) {
case 1: x = 1001; break;
case 2: x = 4002; break;
};
Здравствуйте, 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.
Здравствуйте, xobotik, Вы писали:
X> А как тогда реализовать спуск вниз через case'ы?
Действительно, раз томсон и ричи реализовали этот спуск именно так, то это значит, что никаких иных способов в приниципе существовать не может и никто до иных способов никогда не смог бы додуматься
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, _hum_, Вы писали:
__> если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается ...
что ось абсцисс направлена влево.
И это вы называете естественным?