Программисты на C — самый большой разделённый народ в мире?

    Сегодня, 26 апреля 2016 г., арбитражный суд Орловской области должен был решить вопрос, является ли язык программирования C иностранным языком.

    Столь необычным вопросом суд озаботился из-за Федеральной антимонопольной службы (ФАС), которая возбудилась вот на это объявление, размещённое напротив местного политеха:

    image

    ФАС посчитала это объявление рекламой, а по закону реклама на иностранном языке должна быть дублирована на русском. Руководитель компании Stork.ru Михаил Паулкин с выводами ФАС не согласился, и дело дошло до рассмотрения арбитражным судом Орловской области. Суд должен был вынести решение сегодня, но отложил заседание на 25 мая.

    Нужно заметить, что признание судом языка программирования C иностранным языком позволит программистам на C бороться за официальное признание себя в качестве малого этноса. Малый этнос — это уже не обычное профессиональное сообщество, а народ. Народ же, не имеющий своего государства, может воспользоваться правом на самоопределение, записанным во Всеобщей декларации прав человека ООН.
    Поделиться публикацией
    Похожие публикации
    Никаких подозрительных скриптов, только релевантные баннеры. Не релевантные? Пиши на: adv@tmtm.ru с темой «Полундра»

    Зачем оно вам?
    Реклама
    Комментарии 355
    • +17
      Земля – крестьянам!
      Заводы – рабочим!
      Планету — хакерам!!!
      • +8
        Сишникам — НСР
        (Народная Сишная Республика)
        • +2
          Жители — наСильники.
        • +1
          Может, тогда Сишная Народная Республика? СНР даже удобнее произносить. Ну и фаны Marvell поймут :)
          • –1
            People's Republic of C
            Autonomous Republic of C++
          • +2
            Линуса — в президенты!
            Столмана — в прокуроры!
            Балмера — в жириновские!
            • +1
              Наделлу в главу правительства!
              • 0

                Боже упаси. Он тупо бизнесмен. Где бабло, там и он.

              • +1
                Вспоминаются 80-е годы прошлого столетия в СССР.
                — Долой ЕС ЭВМ (OS-360/370, аналогично сегодняшнему MS Windows)
                — Да здравствует МОС ЕС (аналог ЮНИКС, сегодняшний Linux)
                — Долой язык PL-1;
                — Да здравствует С
                Какая борьба шла за МОС ЕС (своего рода импортозамещение операционных систем).

            • +12
              Для полноты надо рекламу на Brainfuck рядом разместить
            • +1
              А какие варианты то перевода?
              • +7
                *Нужна работа и есть умения – иди в Stork.
                Ваш Кэп.
                • +6
                  Не соглашусь, там это не написано. То что вы что-то придумали, ничего не меняет.
                  • +52
                    если (нужна_работа И есть_навыки) {
                        иди_в _1С
                    }
                    
                    • –1
                      «В *опу Одина» :)
                      • +2
                        Если НужнаРабота И ЕстьНавыки Тогда
                        ИдиВ1С;
                        КонецЕсли
                        • +3
                          Если НужнаРабота И ЗначениеЗаполнено(Навыки) Тогда
                          Перейти ~1С;
                          КонецЕсли;
                          • 0
                            Не, нужно такой:

                            если (фас ИЛИ НЕТ есть_навыки) {
                            иди_с_миром;
                            }
                      • +20
                        На 1С
                        • +3
                          РАПИРА же!

                          https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%BF%D0%B8%D1%80%D0%B0_%28%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29
                        • +5
                          Для этого нужен дипломированный переводчик с Си на русский. Вы такого знаете?
                          • +12
                            Увы, нет.
                            Зато знаю множество толковых переводчиков с русского на Си
                            • +1
                              В антивирусных компаниях таких можно найти.
                            • +3
                              В данном контексте неизвестно что означают переменные и каковы их текущие значения и как они связаны с входными данными. Поэтому судить о том, что обозначает данная СИ-фраза не представляется возможным вообще.
                              • +2
                                Очевидно, что данные переменные определяют, есть ли у кого-то скилл, и нужна ли ему работа. А от текущих значений зависит, пойдет ли этот кто-то на Stock.
                                Мне почему-то все предельно ясно. Что я делаю не так?
                                • +6
                                  Вы слишком доверяете названиям переменных.

                                  int need_job = 14;
                                  struct war* have_skill = (struct war*) malloc(16);
                                  Stork: need_job += 'a';
                                  if (need_job && have_skill) {
                                  goto Stork;
                                  }

                                  Как-то так, например
                                  • +3
                                    Вы их ещё про #define вспомните.
                                    • +11
                                      А вы всегда так пишите, или только когда код коллега читать будет?
                                    • 0
                                      Все дело в том, что это лишь имена переменных, обозвать их можно как угодно.
                                      • 0
                                        Вот ФАС и требует обозвать их на русском.
                                        • 0
                                          Хотя, если рассуждать логически, сравнивать человеческую речь и яык программирования — некорректно. Это же набор инструций и все. Это даже близно непохоже на язык. «Языком» они были обозваны в стародавние времена, чтоб обозначить тот факт, что программист может общаться с машиной. Только это нифига не общение. Ведь общение подразумевает двустороннюю комуникацию. Но с компьютерами двусторонняя комуникация невозможна, так как все «ответы» уже заранее подготовленны программистом.
                                          • 0
                                            Если хозяин отдает команду рабам на человеческом языке, а те просто молча выполняют — это не общение?
                                            • 0
                                              Некудышный пример. Компьютер не обладает самоосознанием. А рабы каждый раз делают выбор, подчиниться или схватить наказание.
                                              • 0
                                                Нет, они же ему не отвечают, не возражают, хозяин от рабов вообще ответа не ждет, откровений тоже. Сплошной императив.
                                            • 0
                                              А разве в C допустимы unicode имена?
                                              • 0
                                                Человек выше сказал «обозвать их можно как угодно».
                                                • 0
                                                  А как вы поняли, что это С, а не С++?
                                                  В С++ допустимы unicode имена, если компилятор позволит. Компилятор от MS позволяет…
                                                  • 0
                                                    Не знаю, как в C, в C++11 это допустимо
                                                    • 0
                                                      Компилятор из Visual Studio умеет юникод.
                                                    • +4
                                                      Угу

                                                      #define esli if
                                                      #define poshel_v goto

                                                      esli (nuzhna_rabota && est_znaniy) {
                                                      poshel_v Stork;
                                                      }
                                                  • +1
                                                    Это лишь предположение.
                                                    Быть уверенным в том, что записано в переменную и записано ли в нее что-либо мы знать не можем.
                                                    • +3
                                                      Мы даже не знаем, C ли это.
                                                  • +1
                                                    А каков данный контекст? И с чего вы вообще взяли, что это «СИ-фраза»? Потому что похоже?

                                                    Точно так же похоже, что словами «need_job» и «have_skill» авторы хотели обозначить «требуется работа» и «имеется навык».

                                                    И эти размышления не определяют, как реклама должна была бы выглядеть по закону. Это всего лишь ответ на ваш вопрос «Каким мог бы быть перевод?».
                                                • 0
                                                  Если верно, что «требуется работа» и «имеется навык», то перейти к Сторк
                                                • +7
                                                  Надо было продублировать на 1С.
                                                  • +2
                                                    Если (НужнаРабота И ЕстьНавыки) тогда
                                                    Перейти ~Stork;
                                                    КонецЕсли;
                                                    • +12
                                                      Наличие кириллицы не делает этот текст написанным на русском языке. В противном случаем на КонецЕсли может возбудится уже не ФАС, а Роскомнадзор. И придётся запрещать 1С по всей стране и возвращаться к книгам бухучёта.
                                                      • –1
                                                        В 1С нет аналога команды перехода goto.
                                                        • +2
                                                          В 1C команда Перейти ~Метка это и есть goto
                                                          • 0
                                                            Упс! Действительно есть, век живи — век учись.
                                                            • 0
                                                              «Перейти» это не та вещь которую стоит знать в 1с.
                                                              • 0
                                                                Пример у них убойный с бесконечным циклом, из которого не факт, что есть выход:

                                                                Пока Истина Цикл
                                                                Для Каждого Элемент Из МассивЭлементов Цикл
                                                                Если ВыполнениеУсловия(Элемент) Тогда
                                                                Перейти ~ВыходИзДвойногоЦикла;
                                                                КонецЕсли;

                                                                КонецЦикла;
                                                                КонецЦикла;
                                                                ~ВыходИзДвойногоЦикла:
                                                                // продолжение вычислений

                                                                • 0
                                                                  Оторвать руки и «Перейти ~ВыходИзДвойногоЦикла;» заменить на «Прервать».
                                                                  • +1
                                                                    Ага, только вот, Прервать из двух вложенных циклов не выведет. )

                                                                    Ну я думаю, что они оператор безусловного перехода на метку сделали для «полноты» языка. Так то они его не используют вообще.
                                                                    • 0
                                                                      Обфускаторы зато его широко используют, между прочим :)
                                                                • +2
                                                                  1С вообще, это не та вещь, которую стоит знать :)
                                                                  • 0
                                                                    Судя по размерам предлагаемых на HH зарплат — не могу так утверждать. :)
                                                                      • 0
                                                                        Кому? Почему?
                                                                        К чему такие категоричные утверждения?
                                                                        • +1
                                                                          Не, нормальная платформа для реализации бизнес логики.
                                                                        • +1
                                                                          Не согласен. Как то мне попалась работа «всего на 5 минут», где нужно было добавить условие по которому из 5-ой циклической вложенности требовалось попасть на уровень второго циклы. При этом кода было на 2-3 листа — анализировать и рефакторить можно было бы целый день. Но зачем, если за это платить никто не будет, а ты видишь этот говнокод в первый и последний раз в жизни? Вот тут знание про переход по меткам очень помогло.
                                                                  • 0
                                                                    скорее «Перейти ~куда_угодно_только_не_в_сторк»
                                                                  • 0
                                                                    Тоже была такая мысль. Ну а вообще вариантов то много: РАПИРА, Кумир… Если поискать, то еще можно чего-нибудь найти.
                                                                    В конце-концов, что мешало им сделать просто блок-схему! :)
                                                                  • –1
                                                                    Разве одного языка достаточно для того что бы считать себя единым народом?
                                                                    Разве главное не происхождение?
                                                                    • +6
                                                                      «Этничность можно представить как форму общественной организации культурных различий, состоящей из тех характеристик, которые сами члены этнической общности считают для себя значимыми и которые лежат в основе их самосознания. К этим характеристикам относится также обладание одним или несколькими общими названиями, общие элементы культуры, представление об общем происхождении и, как следствие, наличие общей исторической памяти.…

                                                                      Определение этничности строится также на основе культурной самоидентификации этнической общности по отношению к другим общностям (этническим, общественным, политическим), с которыми она находится в фундаментальных связях.» https://ru.wikipedia.org/wiki/Этнос

                                                                      «Этнос — исторически сложившаяся этническая общность — племя, народность, нация.

                                                                      Нация — исторически сложившаяся устойчивая общность людей, образующихся в процессе формирования общности их территории, экономических связей, литературного языка, особенностей культуры и духовного облика.» С. И. Ожегов
                                                                      • +43

                                                                        Общей исторической памятью, надо полагать, является git log ядра linux?

                                                                        • +13
                                                                          Это будет религиозной литературой.
                                                                          • 0
                                                                            Ветхий завет. Бытиё. Наши дни.
                                                                            А всех программистов на c-like языках будем считать сектантами :)
                                                                          • +2
                                                                            Общей исторической памятью являются Кен Томпсон и Деннис Ритчи, за консолью PDP-11.

                                                                            image
                                                                          • +1
                                                                            Признаю: все эти определения можно пусть и с оговорками примерить на си разработчиков. Но ведь скажем если я выучу татарский язык — я ведь не стану татарином?=)
                                                                            • +3
                                                                              Вы можете быть татарином и не зная татарского языка.

                                                                              Вообще, в современном мире национальность определяется самоидентификацией. Вы сами должны определиться (если хотите), кто вы больше — русский или сишник.

                                                                              При переписи населения вас просто попросят указать, кто вы по национальности, не вдаваясь в подробности национальностей бабушек или дедушек, а если вы не захотите говорить переписчику свою национальность, настаивать не имеют права.
                                                                          • 0
                                                                            Там всё слегонца сложнее.
                                                                            http://blogovodoved.livejournal.com/4059.html
                                                                            • 0
                                                                              Если про образование народа по языкопрограмистскому признаку не писали в фантастическом произведении, то это маловероятно.
                                                                              Напишите, если знаете такие произведения.
                                                                            • +2
                                                                              Если арбитражный суд откажет в иске, то надо подать групповую аппеляцию в международный суд по правам человека. Даже до ООН дойдём!
                                                                              • +47
                                                                                Я думаю, это все из-за goto в коде.
                                                                                • +2
                                                                                  На самом деле не хватает
                                                                                  have_skill = cpp_skill == excelent && boost_skill > beginner && !windows_only;

                                                                                  • +5
                                                                                    Это уже за разжигание, пойдет… и не по гражданскому кодексу.
                                                                                • –24
                                                                                  GOTO!!! Си!!! Карл!!!
                                                                                  image
                                                                                  • +31
                                                                                    Расслабься и открой исходники ядра линукса.
                                                                                    • +11
                                                                                      вот из за таких как вы из повершела убрали GOTO. и для того чтобы выскочить из одного цикла в другой приходится мудрить переменные и проверки.
                                                                                      • 0
                                                                                        А когда это он там был?
                                                                                        • 0
                                                                                          убрали ещё на этапе разработки.
                                                                                          • –1
                                                                                            Вот это поворот
                                                                                            вот из за таких как вы из повершела убрали GOTO
                                                                                            убрали ещё на этапе разработки
                                                                                            Я не знаком с данным продуктом, но по факту получается, что GOTO нет в первоначальном релизе… т.е. по задумке авторов изначально оператор безусловного перехода не предусмотрен. Вам не кажется, что «такие как я» тут как бы не причем, т.к. GOTO не было в релизе от слова совсем. А то я уже стал сыпать голову пеплом… а оказалось вон оно как.
                                                                                            • 0
                                                                                              так ведь разработчики и относятся к ненавистникам goto
                                                                                              в замен дали break :label
                                                                                              Но както через жо
                                                                                              В Windows PowerShell иметь метки могут только ключевые слова цикла, такие как Foreach, For, While.

                                                                                              в результате из цикла можно выскочить только в начало другого цикла или в конец этого.
                                                                                              Экспресс в середину цикла? да кому оно надо подумали они.
                                                                                              • 0
                                                                                                так ведь разработчики и относятся к ненавистникам goto
                                                                                                Вы напрасно ярлыки развешали. Я не ненавистник, я его просто не использую в си, а студентам просто не говорю, что так можно. При этом в проектах на асме goto jmp — это наше все.
                                                                                                Приведите пример безусловного перехода в середину цикла на си… а то у меня мозг ломается от такой задачи
                                                                                                • 0
                                                                                                  не фанат С но вроде компилируется в билдере
                                                                                                  просьба сильно не пинать мне ассемблер роднее чем С
                                                                                                  #include <stdio.h>
                                                                                                  int main(void)
                                                                                                  {
                                                                                                    int P;
                                                                                                    int PP;
                                                                                                    int count=0;
                                                                                                    int H=50000000;
                                                                                                    int N=61000000;
                                                                                                  
                                                                                                    if (H%2==0) {H++;}
                                                                                                    while (H<=N)
                                                                                                    {
                                                                                                     P=1;
                                                                                                     PP=round(sqrt(H));
                                                                                                     do
                                                                                                     {
                                                                                                  	P=P+2;
                                                                                                  	if (H%P==0) {goto E;}
                                                                                                     }
                                                                                                  	while (P<=PP);
                                                                                                     count++;
                                                                                                  E: H=H+2;
                                                                                                    }
                                                                                                  
                                                                                                  	 printf( "%d\n", count );
                                                                                                  	 getchar();
                                                                                                  	return 0;
                                                                                                  }
                                                                                                  

                                                                                                  • 0
                                                                                                    Я думал, что в си через goto обрабатывают ошибки.
                                                                                                    Как вы их обрабатываете без goto?
                                                                                                    • 0
                                                                                                      В С++ есть try-catch блоки, из того что встречал. Не знаю, имеется ли такой механизм в C.
                                                                                                      По факту ошибки выполняется throw(чё произошло) и ловится в catch. Дальше уже пляшем.
                                                                                                      Возможно, есть что-то ещё.
                                                                                                      • +1
                                                                                                        В Си нет try, catch и исключений.
                                                                                                        • +1
                                                                                                          … но есть setjmp() и longjmp().
                                                                                                          • +1
                                                                                                            По форме (а не по содержанию) ничем не отличается от goto: прыгнуть туда-то.
                                                                                                            Т.е. longjmp ближе к goto, чем к генерации исключения.
                                                                                          • –1
                                                                                            Благодаря этому коментарию, вспомнил что в php есть такая вот штука (http://php.net/manual/ru/control-structures.break.php). В сам break можно передать параметр, который укажет, через сколько уровней цикла можно перепрыгнуть. Добавляет приятный сахарок в синтаксис и отменяет необходимость в «флажках».
                                                                                            • +1
                                                                                              Появление необходимости в флажках сигнализирует о том, что тут что-то не так.
                                                                                              • 0
                                                                                                break с упоминанием какой именно цикл прервать??? И как такое читать потом?
                                                                                            • +17
                                                                                              Ничего страшного в GOTO нет, тем более в Си. Очень часто его использование очень оправдано.
                                                                                              • +4
                                                                                                Нам, излишне наверное категоричный, преподаватель запретил использовать goto. Поначалу было не комфортно, но потом мозг перестроился и с тех пор уже 20 лет как отсуствие goto в программёрской практике совершенно не напрягает. Я уже про него и забыл.
                                                                                                Могу осторожно согласиться, что я просто не встречался с задачами, где без goto никак.
                                                                                                • +1
                                                                                                  Вот вам такая выскочить из середины одно цикла в середину другого. Обойтись можно но надо мудрить кучу if else.
                                                                                                  • +9
                                                                                                    Смутно представляю, когда может появиться такая необходимость. Уверен, что в таких случаях код можно переписать более красиво.
                                                                                                    • +1
                                                                                                      Я, честно говоря, плохо понял что имел ввиду Foolleren, но типовой случай использования goto в C/С++ это выход из двойного цикла (например если мы гуляем по дву-/трехмерной таблице и дошли до точки).
                                                                                                      Википедия
                                                                                                      for implementing multi-level break and continue if not directly supported in the language; this is a common idiom in C. Ссылка на википедию с ссылкой на источник


                                                                                                      Второй способ описан ниже и применим только для C, но не для C++.
                                                                                                      • 0
                                                                                                        bool go_out = false;
                                                                                                        for(int x = -1024; (x <= 1024) && (!go_out); x++){
                                                                                                            for(int y = -1024; (y <= 1024) && (!go_out); y++){
                                                                                                                // any operations
                                                                                                                ...
                                                                                                                // block end
                                                                                                                if(m[x][y] == 'X'){
                                                                                                                    go_out = true;
                                                                                                                }
                                                                                                            }
                                                                                                        }
                                                                                                        

                                                                                                        Чем не решение? Случай синтетический, лично не доводилось использовать такие конструкции.
                                                                                                        • +2
                                                                                                          break'ами мне кажется быстрее будет, чем на каждой итерации проверять состояние переменной.
                                                                                                          • +1
                                                                                                            На ум приходит сразу 4 решения:

                                                                                                            1. Обернуть код в функцию (предпочтительно).
                                                                                                            2. Написать двумерный итератор (тоже хороший вариант).
                                                                                                            3. После go_out поставить break, и проверять условие только во внешнем цикле.
                                                                                                            4. Заменить go_out на x = 1025, y = 1025 (крайне нежелательно).
                                                                                                            • +5
                                                                                                              Нужно просто вынести этот код в функцию и return'ом вернуть найденный элемент.
                                                                                                              • +5
                                                                                                                Тем что это медленнее.
                                                                                                                Goto — это нативная команда ассемблера, JMP и куча нативных Jxx, из этого состоит весь компилированный код.
                                                                                                                Вместо этого в твоём примере тратим память на абсолютно ненужную переменную, на доступ к памяти, на чтение памяти каждый раз в этой миллионной интерации, вместо того чтобы сделать один goto и съэкономить миллиадры циклов процессора. Даже если go_out будет лежать в регистре, это всё равно не бесплатная операция проверки.

                                                                                                                А потом удивляемся, почему у нас всё везде тормозит на 8 ядрах и 4х гигагерцах, потому что каждый уровень разработчиков абстракции побоялся где-то чуть оптимизировать код и побоялся «богомерзкого» нативного goto, якобы «кто-то сказал что так нельзя». Эти же люди бояться писать без «ооп», делают фабрики фабрик даже там где это не нужно и совсем не думают о производительности.
                                                                                                                • –1
                                                                                                                  Если у вас " тормозит на 8 ядрах и 4х гигагерцах" и производительность упирается в проверки флагов и серьезно улучшается от внедрения повсеместно goto, тут что-то у вас не так.
                                                                                                                  • 0
                                                                                                                    Не согласен. Из-за частого обращения будева переменная будет висеть в кэше и время доступа будет крайне малО.
                                                                                                                    • 0
                                                                                                                      и я не согласен, закидывание переменных в регистры в зависимости от процессора даёт в худшем случае 1% буста в лучшем 20+%. профилирование кодека divx выявило, что вытаскивание переменных из стека занимает большую часть времени функции.
                                                                                                                  • 0
                                                                                                                    А подскажите почему тут нельзя использовать while?
                                                                                                                  • 0
                                                                                                                    Как вариант можно использовать try-catch. С++ плоховато знаю, но принцип понятен.
                                                                                                                    говнокод на C#
                                                                                                                    int i, j, k;
                                                                                                                    
                                                                                                                    try
                                                                                                                    {
                                                                                                                        for (i = 0; i < 100; i++)
                                                                                                                        {
                                                                                                                            for (j = 0; j < 100; j++)
                                                                                                                            {
                                                                                                                                for (k = 0; k < 100; k++)
                                                                                                                                {
                                                                                                                                    if (k == 50)
                                                                                                                                    {
                                                                                                                                        throw new IndexOutOfRangeException();
                                                                                                                                    }
                                                                                                                                }
                                                                                                                            }
                                                                                                                        }
                                                                                                                    }
                                                                                                                    catch (IndexOutOfRangeException) {}

                                                                                                                    • +8
                                                                                                                      а ничего, что механизм исключений очень дорогой и является наихудшайшим вариантом из всех возможных?
                                                                                                                      • +1
                                                                                                                        Ну, это понятное дело. Но, если совсем вообще никак, то как вариант. =)
                                                                                                                        • 0
                                                                                                                          а ничего, что иногда выйти из вложенных циклов нужно всего один раз. В таком случае дороговизна генерации исключения и его отлова роли не играет.
                                                                                                                          • +1
                                                                                                                            При этом затраты на обработку исключения могут быть на порядок больше, чем собственно выполнение цикла.
                                                                                                                            • 0
                                                                                                                              А если таких узких мест будет несколько?
                                                                                                                              • 0
                                                                                                                                А чем исключение лучше goto? В ситуации, когда надо выйти из вложенного цикла, и то, и то — костыль. Но goto костыль дешевый и логичный. А генерация исключения — дорогой и нелогичный.
                                                                                                                                • 0
                                                                                                                                  Исключения лучше чем goto потому что корректно уничтожают автоматические переменные.
                                                                                                                                  А goto просто прёт напролом.
                                                                                                                                  Насколько я понимаю.
                                                                                                                                  • 0
                                                                                                                                    Нет, goto тоже их все корректно уничтожит.
                                                                                                                                    On exit from a scope (however accomplished), destructors (12.4) are called for all constructed objects with automatic storage duration (3.7.2) (named objects or temporaries) that are declared in that scope, in the reverse order of their declaration.
                                                                                                                                    • +1
                                                                                                                                      А там куда прыгнули — так же всё создастся в порядке появления в коде, как я понимаю?
                                                                                                                                      Тогда это не просто jmp куда-то на метку, получается, а сложная конструкция.
                                                                                                                                      • 0
                                                                                                                                        It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has POD type and is declared without an initializer.
                                                                                                                                        • +1
                                                                                                                                          В общем, не всё так просто с этими goto.
                                                                                                                                          Мутная тема. По крайней мере в С++, где не только POD.
                                                                                                                                          • 0
                                                                                                                                            В С++ вообще нету простых тем :-Р

                                                                                                                                            Но по крайней мере, компилятор вам не даст «запрыгнуть» внутрь блока в обход инициализации переменных. Или переменные инициализируются по умолчанию (некоторые компиляторы, включая MSVC++, в «нестрогом» режиме это разрешают), или будет ошибка компиляции.
                                                                                                                        • 0
                                                                                                                          Когда я полез за тем что бы узнать чем вообще заменить GOTO в повершеле, наткнулся на такой кейс
                                                                                                                          раскрашивание логов в html, мне он нужен был для совершенно не нормального применения — сравнить скорость работы алгоритма в разных ЯП ну и бонусом в повершеле.
                                                                                                                          также призывается comargo
                                                                                                                        • +1
                                                                                                                          Волосы дыбом встают от такого алгоритма :)
                                                                                                                          • 0
                                                                                                                            Угу, без комментариев понять, что происходит совсем не просто, за это собственно GOTO и не любят, но местами с ним всё же проще чем без него.
                                                                                                                            • 0
                                                                                                                              Вы так или иначе условие выхода из цикла будете проверять через if или case. И если вы прервёте выполнение цикла по break или продолжить очередной цикл по continue не проходя до конца весь цикл, вы получите такой же функционал, который прекрасно работает без goto и значительно облегчает понимание алгоритма и его отладку.
                                                                                                                              • 0
                                                                                                                                Да выход в таком случае будет всё равно через if, но когда надо прыгнуть в середину другого цикла, без goto получается проблема.
                                                                                                                                • 0
                                                                                                                                  Такой же if но уже в другом цикле. Разве нет? Ведь цикл у всё равно нужны условия начала, окончания цикла. Не всё ли равно начинать в начале цикла проверку какую часть выполнять или в середине?
                                                                                                                                  • 0
                                                                                                                                    Надеюсь, я правильно понял семантику требования «прыгнуть в середину другого цикла».
                                                                                                                                    private void doFirstCycle() {
                                                                                                                                      int j;
                                                                                                                                      for (j=0; j<100; j++) {
                                                                                                                                        doYourJob();
                                                                                                                                        if (this.haveToBreak) {
                                                                                                                                          doSecondCycle(3, 200);
                                                                                                                                          break;
                                                                                                                                        }
                                                                                                                                      }
                                                                                                                                    return;
                                                                                                                                    }
                                                                                                                                    
                                                                                                                                    private void doSecondCycle(from, to) {
                                                                                                                                      int i;
                                                                                                                                      for (i=from; i<to; i++) {
                                                                                                                                      doAnotherJob();
                                                                                                                                      return;
                                                                                                                                    }
                                                                                                                                    


                                                                                                                                    В нужном месте той огромной нечитаемой функции, из одного из циклов которой нужно прыгать в середину другого, вместо цикла вставляете вызов функции. Заодно и читаемость повысится.
                                                                                                                                    • 0
                                                                                                                                      когда я говорил про середину, то имел в виду совсем середину — не кратную
                                                                                                                                      — надо начать с doAnotherJob_2();
                                                                                                                                      private void doSecondCycle(from, to) {
                                                                                                                                      
                                                                                                                                        int i;
                                                                                                                                      
                                                                                                                                        for (i=from; i<to; i++) {
                                                                                                                                      
                                                                                                                                        doAnotherJob_1();
                                                                                                                                        doAnotherJob_2();
                                                                                                                                      
                                                                                                                                        return;
                                                                                                                                      }
                                                                                                                                      
                                                                                                                                      • 0
                                                                                                                                        Можно задать выполнение нужных частей кода битовой маской или значением enum'а. Предполагаем, что в следующей итерации цикла мы выполним тело целиком (а с goto так и выйдет); в этом месте мой мозг начинает понемногу плавиться.
                                                                                                                                        private enum dirtyCycleJumper { 
                                                                                                                                        fromFirst, 
                                                                                                                                        fromSecond
                                                                                                                                        }
                                                                                                                                        
                                                                                                                                        private void doSecondCycle(int from, int to, dirtyCycleJumper startFrom) {
                                                                                                                                        
                                                                                                                                          int i;
                                                                                                                                        
                                                                                                                                          for (i=from; i<to; i++) {
                                                                                                                                          switch (startFrom) {
                                                                                                                                        case fromFirst:  doAnotherJob_1(); 
                                                                                                                                        case fromSecond:  doAnotherJob_2();
                                                                                                                                        }
                                                                                                                                        startFrom = dirtyCycleJumber.fromFirst;
                                                                                                                                        }
                                                                                                                                        return;
                                                                                                                                        }
                                                                                                                                        
                                                                                                                                        
                                                                                                                                        

                                                                                                                                        Вызываем doSecondCycle(3, 200, dirtyCycleJumper.fromSecond).
                                                                                                                                        С такими требованиями, действительно, goto будет удобнее. Но случай какой-то уж больно маргинальный.
                                                                                                                                        • –1
                                                                                                                                          случай действительно очень редкий, и очень хорошо подходит чтобы запутать предсказатель ветвлений старого процессора, например разница между феном 1100 и вишерой 9590@ оказалась 8 раз при выполнении в 1 поток при выходе/входе через goto, интеловских свежаков для сравнения к сожалению нет,
                                                                                                                                          когда руки дойдут сравню различные способы обойти goto где он действительно просится( запрыгнуть в середину цикла), но беглый взгляд подсказывает что goto должен отработать быстрее вызова функции.
                                                                                                                                  • 0
                                                                                                                                    Надеюсь, я правильно понял семантику требования «прыгнуть в середину другого цикла».

                                                                                                                                    private void doFirstCycle() {
                                                                                                                                    int j;
                                                                                                                                    for (j=0; j
                                                                                                                            • 0
                                                                                                                              Написанный в прошлом такой свой код (с кучей IF и прыжками из одной части в другую в гигантском цикле) сейчас считаю примером того как не надо было писать.
                                                                                                                              И живет он теперь почти как ИИ, хрен знаешь что выкинет в следующий раз.
                                                                                                                              Лучше переписать так чтобы в принципе не нужно было из середины цикла кудато прыгать
                                                                                                                              • 0
                                                                                                                                ну вот смотрите у нас есть условия которые проверяются для какого то массива, если проходит, то проверяем другие условия во втором цикле, и вот тут если не проходит надо сделать первое и второе если не проходит то только второе.
                                                                                                                                можно сделать goto на второе
                                                                                                                                или сделать ещё одну переменную и break`ом оборвать первый цикл, а потом пройтись по куче if, когда количество итераций плавно так уходит за 6 лямов, каждый if в цикле делает вас печальнее.
                                                                                                                                • +1
                                                                                                                                  А чем Вас return не устроит, с нужным разбиением на функции, как раз вывалитесь где надо?
                                                                                                                                  • 0
                                                                                                                                    в си функции по умолчанию передают параметры через стек, работа со стеком не на всех процессорах происходит без потерь для производительности.