Блог пользователя fedor.birjukov

Автор fedor.birjukov, 15 лет назад, По-русски
Неплохо было бы обобщить все дискуссии по поводу языков программирования и их использования на олимпиадах.

Я писал на многих языках программирования и в разных средах, на каких-то больше, на каких-то меньше, примерно в таком порядке:
QBasic, VBasic, VFoxPro, Pascal, среда Delphi, AS(скриптовой язык в Flash), (читал про C++ и яву) PHP+JS+css+xml+html+MySQL, C++, капельку на Java, курсовые на C#, немного на python, немного C++ с QT.

Pascal - очень простой язык для алгоритмизации и олимпиад. Для школьных олимпиад вполне подходит, потому что на них нужна производительность и скорость написания, а не наоборот.
C++ - после паскаля я советую использовать его на олимпиадах. Я люблю C++ больше всего за его "свободу", так сказать. Правда, из-за нее же и возникают всякие дискуссии о возможных ошибках, которые не отлавливаются компилятором и т.п. На нем можно написать одни и те же вещи по-разному. Это замечание годится почти к любому _си_-подобному языку. А почти все перечисленные языки _си_-подобные. Его или, хотя бы, о нем знают почти все. В стл есть много достаточно неплохих библиотек, но никто не запрещает написать все самому, как в паскале, например. Скорость программирования растет на C++, потому что многое можно записать намного короче, это, конечно, зависит от выбранного стиля, но такая возможность лежит прямо на поверхности.
Java - прочитав дискуссии о яве, которые уже есть на CodeForces, мне даже и не хочется писать на ней на соревнованиях, что бы там ни произошло, какая бы задача ни попалась. Пролистав пару книг по яве в свое время, я для себя понял, что ява классный язык, но он пригодится только для разработки и сопровождения больших проектов. Могу привести пару цитат о яве, они не противоречат моему мнению.
“Fine, Java MIGHT be a good example of what a programming language should be like.  But Java applications are good examples of what applications SHOULDN’T be like.”
(pixadel)

“Java is, in many ways, C++–.”
(Michael Feldman)
Больше цитат можно найти здесь: 101 Great Computer Programming Quotes.
C# - на нем я писал только курсовые и практические для студентов, рекомендовать для олимпиад не буду.
VB - на нем я писал очень давно и продолжать не горю желанием, потому что не помню синтаксис и не вижу преимуществ.
Python, PHP, ... - куча скриптовых и других языков с си-подобным синтаксисом. Не вижу смысла применять их на олимпиаде. Все они полезны/созданы для использования в разных ситуациях, т.е. более применимы в разных частях проектов для решения тех или иных задач.
  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
While I mainly code in C++ myself, I would object in defense of other languages. Many people are using them to their advantage (Petr or the SPbSU ITMO ICPC'09 team are good examples). And they have some obvious pros. C++ currently does not have bigintegers, regular expressions, garbage collection, etc. Even if you like C++, these are good reasons to switch when the running time can be sacrificed, and there are plenty more.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
As you want to use them in programming competitions, it's better to choose a language which is widely supported. C++ is the answer.
Sometimes, it's just a personal preference. Sometimes, it doesn't matter as the programming language is just a tools to express what we've done.
15 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится

Почему пост, где восхваляется С++ и упоминается как "не ужасный" язык Pascal может называться "обобщением дискусии"?
На паскале пишут исключительно те, кто в силу нехватки времени или лени до сих пор не обкатал C++ как следует. Отсутствие SET на олимпиадах сегодня является критичным для огромного количества задач. И не надо только опять начинать "да я напишу хеш быстрее чем ты сет объявишь" :о)

С++ хорош для задач типа 250 на топкодере, когда надо за 2 минуты все вбить. Доводим паттерн до фанатизма типа моего (#define fi(n) for(int i = 0; i < (n); ++i) и пр.), и на очень простой задаче имеем 2х преимущество по времени перед тем кто пишет на Java.

А теперь открываем сложную задачу, в которой надо 300 строк кода, и начинаем уплетать от тех, кто фигачит на Java, потому что они все нужные структуры данных пишут легко и непренужденно там где им надо. Надо завести новый массив чтобы хранить какие-то интексы на 1КК элементов? Я заведу его в той строке, в которой я хочу. А, я пишу на С++? Тогда я буду мотать все наверх, объявлять там, потом мотать вниз искать где же это я был. Или использовать вектор, но это до тех пор, пока не понадобится двумерный массив. Может ярые фанаты С++ мне и приведут 100 примеров того, как это можно сделать на С++, это не отменит того факта, что на Java это лаконично, а на С++ стремно :о) На контестах я всегда писал на C++ потому что опыта четыре года, а с явой от силы год, но это не отменяет того факта, что вообще в целом решать задачи на Java значиииительно приятнее чем на С++.

Это не упоминая всем известной истины, что когда задача на длинное деление или определение простоты числа или на сложную геометрию, те, кто пишут на С++ либо предательски меняют язык либо теряют кучу времени по сравнению с теми, кто пишет на Java. А еще штрафят.

Мое простое, и очень субъективное мнение: готовишься к ACM, и основной язык С++? Java должны быть вторым языком. Пишешь на Java? Не вижу причин обязательно знать C++.

Для других соревнований я уже писал в соседней теме. Если C# поддерживается, и .NET хотя бы версии 3.5, остальные языки вообще не конкуренты по удобству фигачения.

  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Что это еще за преимущество Java при написании сложной геометрии? Никогда не слышал о такой "всем известной истине".
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Всем известные истины - это как британские ученые :о) Парадоксальные штуки.
      В Java есть java awt geom
      http://java.sun.com/javase/6/docs/api/java/awt/geom/package-summary.html
      Я, например, не знаю на память как пересечь две дуги, в любом случае даже если бы я знал, кодячить все это мне бы очень не хотелось, и шанс наштрафить на геометрии всегда очень высок из-за eps, поставленного не там, из-за тупо перепутанного x и y при копипасте.
      Короче это как сравнивать наличие set и фигаченье его лапками :о)

      Пример задачи - D с NEERC 2007. Отличная задача, в которой 10 строк дийкстры, 50 строк построения графа и 200 строк геометрии, на Java превращается видимо в 60 строк из 260 :о) Хотя я никогда не сдавал ее с java.awt.geom, может там какие-то issues.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Саша, врёшь. В Java нет многомерных массивов.

    int arr[N][N];  это ни разу не аналог int[][] arr;

    Вот у команде СибГУТИ не раз было так, что на Java решение не проходило, а на С проходило. На интернет-туре всесиба они за полчаса до конца сказали, что нам надоело переписывать с джавы на си, и ушли, оставив одну задачу недобитой. Длинную арифметику уже нигде не дают.

    >С++ хорош для задач типа 250 на топкодере

    Это если набирать одним пальцем, то экономия велика.

    Задачи 250 как правило, читаются дольше, чем набивается решение.

    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      На Java можно написать даже "ёлочку" из двухмерного массива.

      int a[][] = new int[5][];

      int a[0] = new int[1];

      int a[1] = new int[2];

      int a[2] = new int[3];

      int a[3] = new int[4];

      int a[4] = new int[5];

      То есть если X обозначить ячейку массива a[][] , то получится:

      X

      XX

      XXX

      XXXX

      XXXXX

      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А в С++ так сделать будто нельзя? =) =)
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        #include <cstdio>
        #include <vector>
        using namespace std;
        #define loop(i,a,b) for(int i=a;i<b;++i)
        int main ()
        {
        vector < vector < char > > a;
        a.resize(5);
        loop(i,0,5)
        a[i].assign( i+1, 'X' );
        loop(i,0,5)
        {
        loop( j, 0, a[i].size() )
        putchar( a[i][j] );
        putchar( '\n' );
        }
        }

        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Можно, но незачем. Тупой массив 5x5 будет в C/С++ занимать меньше памяти, чем "треугольный" 5x5 в Java.
          Кстати,  vector < char > обычно называется string :)
          • 15 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            char потому что это выводит как раз ту самую ёлочку при исполнении =)

            а вот список рёбер сильно разреженного графа с достаточно больши количеством вершин в виде массива векторов будет занимать много меньше памяти, чем матрица смежности этого же графа.

      • 15 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится

        Это не двухмерный массив, а массив [ссылок/указателей] на массивы. Т.е. при доступе к одному элементу уровней косвенности не 1, а 2. Разница в быстродействии часто может быть очень существенной и приводить к TL. Потребление памяти также выше: невинно выглядящий new int[N][2] требует, как минимум, втрое больше памяти, чем new int[2*N]; Если ваше решение имеет пятикратный запас по скорости и памяти, то нет проблем, а вот если запас менее чем двухкратный -- то начинаются тонкости :))

        В Си двухмерных массивов формально тоже нет, но там у int arr[N][N]; указанных недостатков нет. В Сишарпе синтаксис объявления двухмерного массива следующий int[ , ] arr;

        А вот что это:

        int[][] a;

        a[5]=a[4]=a[3]=a[2]=a[1]=a[0]=new int[5];

        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          "Это не двухмерный массив, ... то начинаются тонкости :))"

          С этим абсолютно согласен. =)

        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Вроде как в шарпе доступ к элементу у int[][] быстрее чем к int[,]
          Только вот создание медленнее
          • 15 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            1. Неплохо бы проиллюстрировать примером.
            2. Почему тогда Петя предпочитает int [,]  (например вот: http://www.topcoder.com/stat?c=problem_solution&rm=303851&rd=14149&pm=10741&cr=10574855)
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              1. http://paste.ubuntu.com/412198/
              Простите, если не прав =)
              2. Ну во-первых видимо все-таки объявлять [,] удобнее нежели [][] (в шарпе нельзя просто написать new int[n][m] например). Да и как я сказал лишь доступ к элементу быстрее, создание все-таки медленнее.
              • 15 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Это тест в высшей степени бессмысленный, потому что умный оптимизатор должен увидеть, что результат не используется, и выкинуть все циклы.
                Пускай лучше матрицы умножает.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Про 250 не согласен, если она очень простая и условие сравнительно короткое, фанатичные паттерны помогают очень неплохо сдать ее. Я пару раз был первым на контесте, кто сдавал 250.

      Про многомерные массивы - my bad :о) Но, на правах рекламы - зато в C# есть как массив ссылок на массивы, так и многомерные массивы :о)
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        * помогают сдать ее  очень быстро
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Средний участник топкодера может прокачать скорость набивания текста, но вряд ли сможет поднять скорость чтения и думания до твоего уровня. Впрочем, SRM 462 показывает, что условия никто и так не читает :)

        Да ты в общем очень хороший пример, что для успеха на олимпиадах вполне достаточно знать небольшое подмножество языка программирования, и то поверхностно.
  • 15 лет назад, # ^ |
      Проголосовать: нравится +2 Проголосовать: не нравится
    "На паскале пишут исключительно те, кто в силу нехватки времени или лени до сих пор не обкатал C++ как следует."
    Ну-ну, расскажите это например Гене Короткевичу)
    • 15 лет назад, # ^ |
        Проголосовать: нравится +2 Проголосовать: не нравится
      Наличие одного человека на планете, который может пороть на паскале, не является статистически важным.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Да, C# растет неплохо. Java... Основное применение у сишников - длинная арифметика. Да, в яве много библиотек, но все ли из них можно использовать на соревнованиях? И как они работают(быстро?, медленно?, ровно?, коряво?)? ИМХО еще одного моего друга: "В яве все коряво написано", - но он все равно использует BigInteger, потому что на ACM без ниго почти никуда. Хотелось бы услышать толковые замечания людей, которые пишут только на Яве или много используют её.
Моя цель - из километровых споров и дискуссий вынести наружу хоть какой-то смысл. Разобраться для себя и написать что-то конкретное за и против каждого языка, можно с примерами и пояснениями.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    На ПРИЛИЧНЫХ контестах (Topcoder SRM, NEERC, ICPC finals) уже много лет как не дают задачи, где нужен BigInteger. С другой стороны, если разрешить использовать в С++ библиотеки длинной арифметики из GMP или буста, то на длинной арифметике Ява будет сливать С++ подчистую как по скорости работы, так и кодячения.
    И что забавно, до появления Явы в числе ICPC-языков такие задачи встречались относительно часто.
    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Просто тогда еще был какой-то смысл их давать.
      Сейчас тоже иногда попадаются, но, видимо, на неприличных) Хотя нет, на нирке, по-моему, недавно была одна.
      Длинную арифметику было бы недурно добавить в стл. А качество библиотек, по-моему, в С++ лучше ПОЧТИ всегда.
      Я поэтому и не называю паскаль ужасным языком, а очень хорошим для алгоритмизации, потому что дальше уже идет больше битва библиотек(стл потив ява, против шарпа... это не битва языков).
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Что такое "качество" библиотек? Чем лучше? В Java баги в реализации стандартной библиотеки? Не пойму никак..
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Лично я не тестировал ява либы на скорость исполнения, но наслышан. Друг пишет на C и на C#, ну и на яве редко, только ради BigInteger.
          В C++ я тестил либы и такие же реализованные алгоритмы - работают быстро, а иногда нереально быстро на числах, но если надо оперировать объектами, то вперед выходит самописный вариант. Например sort.
          Про либы явы знаю немного, никто из тех, кто на ней пишет, сюда заглядывать не хочет/не хотел, поэтому ничего объективно гарантировать не могу, подтверждения моим словам пока нет.
          Может, напишу что-нибудь, замерю время, может кто-то мог бы привести сравнительную табличку чего-нибудь. Что да как работает, интересующие вопросы: быстродействие при разных нагрузках. Например сортировка 300 000 массива, можно два раза) стандартная и самописанная, можно только стандартную. И что-то дискуссии по поводу ввода-вывода есть, про то, что и там косяки.
          • 15 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Косяков во вводе нет! В зависимости от того, что ты хочешь прочитать - у тебя на выбор разные методы чтения.По поводу замеров - можешь посмотреть пару моих статей и добавить свои результаты к ним. Хотя мне кажется, что все контесты потихоньку идут к тому, что любую задачу можно будет сдать на любом языке и это правильно. Даешь свободу выбора языка !
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится
              =) Я просто ждал, ждал, надоело) Но и люди наконец-то подтянулись. Ребята, я удивляюсь. Неужели никто не делал крэш тестов? Просто выложили бы таблички времени исполнения одинаковых операций в яве, с++, с#.
              Я сейчас просматриваю содержание сети. Есть некоторые ответы, но их надо проверить еще разок самому.
              Вот, например:
              http://www.codenet.ru/webmast/java/javavscpp.php  -  в каждой шутке есть доля правды... комментарии?
              http://habrahabr.ru/blogs/programming/66562/  -  еще тесты, не оч радуют, но и не оч трагично
              http://mocksoul.livejournal.com/5789.html - тесты
              а это немного противоречит предыдущему линку - http://dchekmarev.ru/blog/article/1249718025
              А теперь хотелось бы спросить людей, которые сами пишут на яве: "Что вы можете сказать по этому поводу?"
              • 15 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                неужели ещё не понятно, что Java медленнее C++? Но я бы не стал бы выбирать язык в основном по критерию скорости выполнения на нём программ. Мне нравится Java за её строгость и гибкость одновременно, наличие полезных библиотек. А по поводу медленной работы - всегда есть повод придумать какую-нибудь оптимизацию. Как приятно бывает получив TL посидеть над кодом , найти bottleneck, уменьшить на него нагрузку и получить AC. Начинаешь очень чутко чувствовать все проблемные места кода.Такой опыт бесценен.
                • 15 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится
                  "Гибкость Java" это ты отжёг
                  • 15 лет назад, # ^ |
                      Проголосовать: нравится 0 Проголосовать: не нравится
                    Да. Весьма грамотные и "прозрачные" для понимания конструкции, которые позволяют писать даже  сложные вещи, используя весьма простые средства и т.п.
                    • 15 лет назад, # ^ |
                        Проголосовать: нравится 0 Проголосовать: не нравится
                      Гибкость в Яве уменьшена by design, чтобы меньше возможностей выстрелить в ногу было, о чем и написал Пётр в комменте ниже.
    • 15 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится
      видимо alliumnsk  - ярый против Java. тогда такой вопрос: 1) почему Пётр пишет на джаве; 2) насчёт скорости кодячения - это не факт на мой взгляд, учитывая что в эклипсе можно понаставить Code Templates и всё будет быстро, т.е. что-то наподобие этого вашего знаменитого #define. к тому же в эклипсе есть Camel-Case Search.. т.е. чтобы создать PriorityQueue достаточно написать PQ и нажать Ctrl-Space. А ещё, тут конечно можно сказать вот типо ламеры и т.д., НО в большинстве случаев отладка на джаве занимает НАМНОГО меньше времени чем на С++. Я даже удивляюсь тому, как я мало трачу времени на отладку (пишу на джаве, а раньше на С++). А для новичка в программировании или в спортивном программировании это большое дело на мой взгляд. Да и с другой стороны намного приятнее искать ошибки, когда тебе хотя бы говорят на какой строке программа свалилась. Так что С++ рвёт по скорости работы и т.д. - Да с этим не поспоришь. Ну и что? беря пример с Petr или UDH-WiNgEr можно сделать вывод что на джаве/шарпе можно круто выступать и занимать первые места по "кодячению".
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        1) Собственно, Петра и других людей,  которые пишут на яве, и хотелось бы услышать, придется лично приглашать, видимо)
        2) Code templates и #define - совершенно разные вещи, как препроцессор и текстовый редактор.
        3) Вот, уже интереснее. Camel-Case. Уже интереснее.
        4) Дэбаг - зло. В любом языке. Конечно, приятно, когда на ошибку тыкают пальцем.
        5) C# не ява. Это еще одна песня) На нем даже пишут и неплохо... Еще не копался, но перспективы через год, надеюсь не дольше, хорошие.
        • 15 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Процесс дебагинга - зло.

          А дебаг - часто жизненно необходимая вещь для поиска (нетривиальных) ошибок.

          • 15 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Как говорит один мой друг: "Дэбаг облегчает жизнь во время написания программы, но портит её впоследствии привычкой писать говнокод и отлаживать его".
            • 15 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              суровый у тебя друг.

              Без дебага трудновато научиться писать программы без дебага :) Для всего нужен опыт.

              • 15 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                Проведу аналогию с лыжами: обучение ходьбе на лыжах обязательно включает в себя хождение на лыжах без палок.
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        1. Что за фигня? Пётр пишет на Сишарпе в 65% случаев (http://iadjust3.scm.ca/tcstats/relative.aspx?handle=Petr), а на Яве тогда когда он пишет с компьютера, на котором нет VS
        2. уже Бирюков сказал
        Я не люблю Яву, потому что это не только язык программирования, но и движение со всеми вытекающими. Начинать учить новичков с Явы никак нельзя: http://local.joelonsoftware.com/mediawiki/index.php/%D0%9E%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BD%D0%B0_Java
15 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Java was *NOT* inherited from C++. It was only marketed as remake of C++ because there were many C++ coders around. C is the divergence point between Java and C++.

and, from here: http://norvig.com/java-lisp.html

The variance for Java was lower than for C or C++. (Cynics could say that Java forces you to write uniformly slow programs.)

So blame the language, not coders. We know many clever people use Java. It would be a lot of good Java apps if it was possible to write them.

About C# : At times, I look at some stats at Topcoder and it looks like picking C# in Topcoder algorithm seems to be superior over C++ and Java. (which, on other hand, might be not statistically significant because sample size is too small and biased because *you-know-who* uses C#).

Maybe Topcoder doesn't gives away stats per languages to avoid holy wars :D

VB.NET is just C# with syntax inherited from VB to ease porting of VB apps. So there is no reason to even think about VB.NET.

15 лет назад, # |
  Проголосовать: нравится +6 Проголосовать: не нравится
I think Java/C# (I don't see much difference between them except speed) are best suited for programming contests, since it's so much harder to make a mistake and so much easier to find and fix a mistake in a Java program than in a C/C++ program.

Much more strict type checking (implicit casts from long long to int and from int to bool??), out-of-range checking, code flow checking (allowing to read from uninitialized variables? why would a language allow that?), fantastic IDE which finds a lot of other mistakes for you, fantastically convenient debugging, more explicit syntax (a language with less power actually leads you to writing more readable programs), more explicit error messages (and the errors are always reproducible!) - to name a few advantages, but I've probably missed some more.

I think that writing correct programs and fixing them quickly when they're not correct far outweigh the disadvantages mentioned above (slower execution, longer programs). Even a 2x slowdown is almost never important in programming competitions, while a WA always is :) And I believe that most of the time at a programming contest is spent in thinking (including the thinking you do _while_ writing code), not in writing code, so the length of the program (or the typing speed, for that matter) is irrelevant.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    And I believe the availability of various libraries is also not that important. So if I were to choose between C++ and Pascal, I'd choose Pascal because of the same argument (much more strict checking of everything).
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Which is faster?
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    allowing to read from uninitialized variables? why would a language allow that?

    Sometimes compiler is unable to determine if reading from uninit var will occur.

    int foo(int arg) {
        int[] x;
        if(arg<0) return -1;
        if(arg==0) x = new int[1];
        if(arg>0) x = new int[2];
        x[0]++; // Bogus error here

    C was intended for people who are smarter than their compilers. Vice-versa for Java.

    • 15 лет назад, # ^ |
        Проголосовать: нравится +14 Проголосовать: не нравится
      I believe this is a an example of how using Java makes you write more readable code :) I think if-elseif-else is more appropriate here.

      I don't think this has anything to do about "smarter". I'd call this "with more attention to tiny details". And I'm perfectly happy to admit my compiler has more attention to tiny details :)
      • 15 лет назад, # ^ |
          Проголосовать: нравится -6 Проголосовать: не нравится

        if-elseif-else is nothing but just a hint for compiler.

        In mathematical notation - intended for humans - it is rarely used.


15 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится
Who has written English text? It is terrible.