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

    +2

    1. 1
    2. 2
    3. 3
    4. 4
    int a = -1;
    while(+a){
        if(a == 0) break;
    }

    Запостил: puksus, 22 Апреля 2016

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

    • объясните для не посвященных.
      Ответить
    • Унарный плюс вместо инкремента?
      Ответить
      • наверно. никто не знает. но может просто кто-то извратный вечный цикл так решил написать.
        Ответить
    • Ох тыж, а что в С++ нельзя переопределить унарные операторы!? Даже в С++17?
      Ответить
      • > int a
        У встроенных типов никакие нельзя переопределять, даже в C++17.
        Ответить
        • И даже каким-нибудь #ifdef int #undef int? или g++ -Dallow_integral_literals?
          Ответить
          • У определённых пользователем типов можно переопределять в т.ч. унарные операторы, у встроенных - нет.
            Ответить
          • можно, заменив int на какой-нить класс
            Ответить
          • Можно так: http://ideone.com/pWd1Dy

            class fake_int {
              public:
                friend fake_int& operator+(fake_int& i) {
            ...


            А потом перед использованием:
            #define int fake_int
            Ответить
            • Код может перестать компилироваться. int - POD, а fake_int - нет.
              Ответить
              • Кстати, мне показалось жутко неинтуитивным, что выражение fake_int a = 1; вызывает конструктор, а не operator=. При разбиении же выражения на две строки в первой вызовется конструктор, а во второй — operator=.

                fake_int a = 1; // Тут вызовется конструктор fake_int(1)
                fake_int b; // А тут вызовется конструктор fake_int() без аргументов
                b = 1; // А тут вызовется operator=(1)


                Мне уже страшно представить, во что превращается программа с неэлементарными типами.
                Ответить
                • fake_int f()
                  {
                    return 1;
                  }
                  
                  void main()
                  {
                    fake_int a = f(); // И здесь тоже, вполне возможно, вызовется конструктор
                  }
                  Ответить
                • > Class obj = init;
                  Это альтернативный способ вызова конструктора просто... (ваш кеп). В таком случае вообще никогда оператор присваивания не вызовется (unless его кто-то специально не дернет из конструктора).
                  Ответить
    • С++ не нужен
      Ответить

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