1. C++ / Говнокод #8132

    +146

    1. 1
    2. 2
    3. 3
    const static int m=5, n=5;
    int matrix[m][n];
    cout << 1[2[matrix]];

    Пруй:

    http://ideone.com/bO5Gn

    Запостил: RS-232, 09 Октября 2011

    Комментарии (41) RSS

    • пруй
      Ответить
    • Какой такой пруй?
      Ответить
      • пруф
        Ответить
      • так не терпелось опубликовать эту хрень, что по клавиатуре не попадал. a[i] = *(a + i)
        Ответить
        • a[i] = *(a + i) = *(i+a) = i[a]
          я бы даже сказал так
          Ответить
          • Да, я тоже читал великую "The C Programming Language". Однако в другой ветке утверждают, что тут из-за перегрузки операторов ассоциативность сложения нарушилась.
            Ответить
            • внизу наверно сильно удивятся когда узнают, что [] ввели чисто для удобства... после чего получили такой интересный эффект.
              Ответить
    • a[i] эквивалентно i[a], автор только узнал?
      Ответить
      • У него оператор сложения перегружен и от перемены мест слагаемых сумма меняется =\
        Это рак
        Ответить
      • так делают, чтобы не вызвался перегруженный оператор для matrix, а вызвался настоящий. Это единственный способ уберечь себя от попадания в просак с перегруженным оператором. (:
        Ответить
        • Ааа, вон оно чё. Пиздец, кресты такие кресты...
          Ответить
          • Да врёт он всё. Для встроенных типов операторы не переопределяются.
            Ответить
            • Для не встроенных зато перегружаются.
              Ответить
              • типа: сам ям нарыл, сам в них прыгаешь с разбегу?

                на кой хер народ все подряд перегружает?... если можно не значит что нужно.
                Ответить
                • >на кой хер народ все подряд перегружает?
                  А я то откуда знаю. Это не мои проблемы. Я то так не делаю. Может BOOST::Spirit 2.0 делали? Там это к месту. Только сам Spirit вообще нигде не к месту.
                  Ответить
        • Вот уж действительно крестопроблемы...
          Ответить
        • Если чё я говорю про перегруженный оператор индексного доступа. Менять местами имя "массива" и индекс - способ защиты от такой перегрузки.
          Ответить
        • Какой ещё перегруженный оператор для matrix? Не бывает (по крайней мере в C++).
          Ответить
          • В данном случае нет, а вот в смартпоинтерах, кастящихся до указателя это возможно.
            Ответить
            • Где здесь смартпоинтеры?
              Ответить
              • >>Где здесь смартпоинтеры?
                >В данном случае нет

                Я просто привел пример, где это возможно. К теме говнокода это не относится почти.
                Ответить
    • Вы ещё приглядитесь, как к 2ух-мерному массиву хитро обращаются: Как к 2ум одномерным.
      Ответить
    • .
      Ответить
      • XXXGovno, а на каких ещё языках ты пишешь программы, кроме C/C++? @Esper вон лисп ещё знает (и любит), @gegMoro4 полиглот: знает как минимум ещё Java и Python. А на чём ещё пишешь ты?
        Ответить
        • По работе: С, С++, C++\CLI, C#, F#, Assembler (Повсеместное засилье этих языков меня просто выбешивает. Я про Си-группу и от них никуда не уйти, тк другие никому не нужны. Тарас меня должен понять)
          Просто изучал\пописывал для себя: D, Python, Prolog, СL, Elrang, Scala, Boo, Objective-C, OCaml (Из этой группы понравились первые 6, но есть некоторая неприязнь к динамически-типизированным языкам, тк люблю проверяющийся на этапе компиляции код, 7ой - понравился, но пока не пригоден для профессионального использования)
          Хочу ещё попробовать Haskell, Nemerle ну и ещё некоторые, где-то составлял список языков к изучению на харде.
          Ну и никому не говорите, что я писал на Turbo Pascal 7.0.
          И ещё есть языки, что пользуются популярностью: Java и в нашем городе ещё Delphi и 1С. Первый я смотрел, но писать на нем не хочу, тк мало синтаксического сахара и приходится писать много лишнего. На втором я тоже долго писал, но тоже Тссс. И без комментариев. 3тий язык - также без комментариев и я на нем не писал ^_^ .

          Люблю выразительные языки, где малым можно сделать многое и при этом все читаемо.
          Ответить
    • Итак, что мы имеем... Сначала программисты на C++ создают абстракцию, вводя перегруженный оператор доступа по индексу, а потом пишут непонятный с первого взгляда код для того, чтобы избежать использования этой абстрации (видимо, не доверяют коллегам). Отличная идея. Продолжайте в том же духе.
      Ответить
      • Не создают. В C++ это невозможно.
        Ответить
        • Что-то какой то слабенький у вас С++. Все возможно. Читайте выше.
          Ответить
          • А вы C++ с анашой не спутали?
            Ответить
            • А что, лично у вас уже были такие прецеденты? Осторожнее с анашой нужно.
              Ответить
            • вот откуда выражение "курить маны" - от них штырит
              Ответить
              • от манов люди только умнеют
                людей от них не штырит, если употреблядь по назначению врача
                Ответить
      • Чёрт, а в Аде нельзя перегружать оператор взятия элемента по индексу. Вместо a(i) приходится писать что-то типа a.el(i)
        Ответить
        • А в Scala вообще упразднили особый синтаксис для взятия элемента по индексу. Вместо этого используют функторы:
          val numbers = Array(1,2,3,4);
          println( numbers(0) );       // hey, ma! every array now is just a functor.
          println( numbers.apply(0) ); // the same result: 1
          Ответить
          • Одна из ошибок большинства языков — квадратные скобки для индексации. В этом совершенно нет надобности.
            Ответить
            • А вот языки матпакетов Mathimatica и по моему Maple считают, что квадратные скобки [] следует использовать так:
              func[параметры]. Это позволяет зрительно отличить вызов функции от круглых скобок, предназначенных для записи выражений (((100(x+23))+2)) и тд, иначе вызов функции в такой кутерьме скобок может теряться и читабельность снижаться.
              Ответить
            • Мне очень понравилась эта идея в Scala - все массивы коллекции реализуют PartialFunction, так получается однородный и выразительный подход.
              assert( Set(1,2,3)(3) == true ) // Set.apply == contains
              assert( Map('1' -> 'a')('1') == 'a' ) // Map.apply = get
              Ответить
              • Зато в С++ функтор может быть одновременно массивом и функцией. :-p
                Ответить
                • а что в этом хорошего?
                  так проще нарушить принцип KISS? :)
                  Ответить
                  • Да абсолютно ничего.
                    Вы так говорите, как будто мой настоящий ник не знаете. (:
                    Ответить

    Добавить комментарий