avva: (Default)
[personal profile] avva
Проверьте себя: сумеете ли вы правильно ответить, не запуская, что должна напечатать эта программа:

    #include <iostream>
    #include <complex>
    using namespace std;

    class Base {
    public:
        virtual void f( int ) {
            cout << "Base::f(int)" << endl;
        }

        virtual void f( double ) {
            cout << "Base::f(double)" << endl;
        }

        virtual void g( int i = 10 ) {
            cout << i << endl;
        }
    };

    class Derived: public Base {
    public:
        void f( complex<double> ) {
            cout << "Derived::f(complex)" << endl;
        }

        void g( int i = 20 ) {
            cout << "Derived::g() " << i << endl;
        }
    };

    void main() {
        Base    b;
        Derived d;
        Base*   pb = new Derived;

        b.f(1.0);
        d.f(1.0);
        pb->f(1.0);

        b.g();
        d.g();
        pb->g();

        delete pb;
    }



Я вот не смог, ошибся в одном месте. Значит ли это, что я не помню C++? Наверняка. Я много лет не писал на нём (в отличие от C, на котором пишу время от времени). Но знаете что? я пока не соскучился.

Нафиг, нафиг. Java, C#, да что угодно пусть придёт, но от этого плюсплюсного конгломерата сложных и плохо продуманных синтаксических сталагмитов пора избавляться.

Хотите ещё один курьёз? Пожалуйста. Вот такой код:

#include <iostream>
#include <complex>
using namespace std;
                                                                                
int main() {
  int x=1, y=1;
  for( int i = 0; i < 100; ++i ) {
    ++y;
    // What will the next line do? Increment???????????/
    ++x;
  }
  cout << "x=" << x << " y=" << y <<endl;
  return 0;
}

что напечатает?

Думаете, "x=101 y=101"? А вот и нет. Он напечатает "x=1 y=101". Угадайте почему.

Когда кто-то писал комментарий, в конце строки вопросительных знаков случайно отпустил shift, и получил слэш. А ??/ — это триграф, обозначающий бэкслэш, т.е. \, и этот \ съедает следующий за ним \n, и делает строку ++x; частью комментария.

Про триграфы можно прочитать здесь. Там же про диграфы есть. Вы знаете, что в C++ можно использовать "and" и "or" вместо && и ||? Я не знал.


Да, кстати, правильные ответы и объяснения по поводу первого куска кода есть здесь. Там же есть ещё много сложных вопросов и мини-статей по синтаксису и возможностям C++.
Page 1 of 6 << [1] [2] [3] [4] [5] [6] >>

Date: 2004-03-15 12:25 pm (UTC)
From: [identity profile] cema.livejournal.com
Да вообще-то. Да.

Date: 2004-03-15 12:46 pm (UTC)
From: [identity profile] anton.livejournal.com
Нафиг, нафиг. Java, C#, да что угодно пусть придёт, но от этого плюсплюсного конгломерата сложных и плохо продуманных синтаксических сталагмитов пора избавляться.

В C# и Java, не думая, тоже можно много чего наворотить.
А ничего подобного тому, что сейчас можно делать на C++ вообще, не говоря уж об элегантности нового кода и производительности, сделать на них просто нельзя.

По крайней мере, до нормального появления в них шаблонов, да и дальше, я так чувствую -- они заметно хуже продуманы, мне кажется.

Date: 2004-03-15 12:48 pm (UTC)
From: [identity profile] anton.livejournal.com
Ваша ссылка на gotw напомнила мне вашу же недавнюю запись про ссылку на Гугл :)

Date: 2004-03-15 12:57 pm (UTC)
From: [identity profile] tejblum.livejournal.com
Второй курьёз, кстати, отлично работает и в C.

Date: 2004-03-15 01:04 pm (UTC)
yigal_s: (Default)
From: [personal profile] yigal_s
Я не специалист по столь тонким вопросам, да и на С давно не пишу, но, кажется, в ISO C99 есть ровно такой же набор ди/триграфов, что и в С++.

Что до 1-го примера, то было бы интересно услышать, как должен выглядеть язык, в котором пример, подобный приведенному, не вызовет проблем с пониманием у человека, слегка подзабывшего "закоулки".

Или, переиначивая вопрос, скажем, почему проблемы, подобные приведенным в первом примере, не возникают в тех же C# или Java?

Date: 2004-03-15 01:08 pm (UTC)
From: [identity profile] trurle.livejournal.com
О, да, продуманность C++ есть совершенно неоспоримый факт. Особенно multiple inheritance, по сравнению с которой предложенная головоломка просто ничего.
И шаблоны - это именно то что доктор прописал. Попробуйте на досуге отладить чужой код, написанный с интенсивным применением шаблонов. Будет Вам просветление, в самом лучшем виде.
Маму родную не узнаете.

Date: 2004-03-15 01:18 pm (UTC)
From: [identity profile] evolver.livejournal.com
Думаете, "x=101 y=101"? А вот и нет. Он напечатает "x=1 y=101". Угадайте почему.

С gcc 2.95.3 фокус не прошел. Сказало "x=101, y=101". В исходнике последовательность пердставлена как "3f 3f 3f 2f 0a 20 20", т.е. вроде бы все с начальным условием задачи совпадает.

Date: 2004-03-15 01:19 pm (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
По-моему, триграфы тянутся в C с каких-то незапамятных времен.

Date: 2004-03-15 01:21 pm (UTC)
From: [identity profile] anton.livejournal.com
Вы берётесь утверждать, что код на C# и Java, когда в них появятся шаблоны (а они там появятся -- есть и в Tiger, и в C#v2), будет намного лучше выглядеть?

Или вы считаете, что и шаблоны и множественное наследование — зло в принципе.

Или вы хотите сказать, что развитие этих языков лучше запланировано, чем C++, и с появлением в них новых возможностей, это всё будет выглядеть лучше, чем то, как развивается C++?

Претензий к нему предъявить можно много, нет спора, но в целом лучшего пока нет. Да, в нём есть много артефактов, и на нём можно писать и плохо, но и Java и C#, увы, не явили нам дорогу в будущее, и сейчас, как мне кажется, начинают, даже, несколько подражать новому C++.

А хороший код с использованием шаблонов обычно читается (с некоторой привычкой, конечно) легче, чем код аналогичной функциональности без них. Ну а плохой можно на чём угодно написать так, что читать невозможно будет.

Date: 2004-03-15 01:27 pm (UTC)
From: [identity profile] ostap.livejournal.com
Это всё было заложено уже в С. С++ - прямое продолжение сишной идеологии.
Что вообще хорошего можно сказать про язык, в котором обычная переменная по умолчанию передаётся по значению, а массив - по адресы, и более того, где массив вообще, не изъёбываясь специально, нельзя передать по значению, а только по адресу и можно. Прямая дорога к отладочному аду. Мне кажется, одного этого достаточно, чтобы с ним не связываться, если есть хоть малейшая возможность.

Date: 2004-03-15 01:27 pm (UTC)
From: [identity profile] trurle.livejournal.com
Или вы считаете, что и шаблоны и множественное наследование — зло в принципе.
Именно так. Зло.
Или вы хотите сказать, что развитие этих языков лучше запланировано, чем C++, и с появлением в них новых возможностей, это всё будет выглядеть лучше, чем то, как развивается C++?
Планирование развития языка - это, простите, оксюморон.
Вы берётесь утверждать, что код на C# и Java, когда в них появятся шаблоны (а они там появятся -- есть и в Tiger, и в C#v2), будет намного лучше выглядеть?
Насчет C# я и не сомневался.
А хороший код с использованием шаблонов обычно читается (с некоторой привычкой, конечно) легче, чем код аналогичной функциональности без них.
Гы, читать-то его легко. А вот если код ведет себя не так как следует из чтения, тогда и приходит просветление.

Date: 2004-03-15 01:30 pm (UTC)
yigal_s: (Default)
From: [personal profile] yigal_s
Это да. Собственно, для тех времён они и нужны были.

Date: 2004-03-15 01:30 pm (UTC)
From: [identity profile] ydolgov.livejournal.com
По-моему, в мире есть только два языка от Бога: C и Common Lisp (я рассматриваю Scheme как разновидность Lisp). Всё остальное, естественно, от Лукавого.

К слову сказать, для обектно-ориентированного программированя простой C подходит гораздо больше, чем C++.

Мне нравятся языки, похожие на песок, из которого можно построить замок любой красоты, а не набор уродливо выточенных эклектически подобранных блоков.

Я не понимаю, почему люди почти всегда игнорируют простое и красивое, а выбирают для пользования всякую дрянь. Ведь это не только в программировании, это, похоже, во всём...

Date: 2004-03-15 01:32 pm (UTC)
yigal_s: (Default)
From: [personal profile] yigal_s
А важно (и это я явно не обозначил), что лишь в
С99 есть тот же набор Хграфов и поддержка //-комментария.

Date: 2004-03-15 01:37 pm (UTC)
From: [identity profile] anton.livejournal.com
Именно так. Зло.
Ну тогда просто no comments. Это (по крайней мере, шаблоны -- множественное наследование, всё-же, несколько спорно) явный путь развития языков -- все пришли к этому, не смотря на всё сопротивление к введению этого, которое было, например, в Java. Это просто слишком нужный и мощный механизм.
Такая точка зрения -- примерно то же, что многие поначалу говорили про ООП.

Планирование развития языка - это, простите, оксюморон.
Не всегда. То, как и в каком направлении будет развиваться язык, всё-же, планируют :) И мне кажется, что даже у такой неповоротливой структуры, как комитет стандартизации C++, это получается лучше, чем в кулуарах Sun или MS.

А что вы считаете лучшим на сегодня языком?

Date: 2004-03-15 01:41 pm (UTC)
From: [identity profile] drw.livejournal.com
В 3.2 то же.

Date: 2004-03-15 01:42 pm (UTC)
yigal_s: (Default)
From: [personal profile] yigal_s
Вы знаете способ, как без темплейтов написать тройку одинаковых мало-мальски эффективных контейнеров под три различные типа, не занимаясь copy-pastе-ом?
From: [identity profile] ifyr.livejournal.com
Шаблоны в C# и Java появятся только на бумаге (то, что называется "Generics" -- это просто система проверки типов и скрытых кастов). Подробнее -- здесь

Date: 2004-03-15 01:55 pm (UTC)
From: [identity profile] ifyr.livejournal.com
> Что вообще хорошего можно сказать про язык, в котором обычная переменная по умолчанию передаётся по значению, а массив - по адресу

Так массив же -- это просто указатель, так что здесь все логично. Хотите семантику по значению -- std::vector к вашим услугам.

Date: 2004-03-15 01:57 pm (UTC)
From: [identity profile] ydolgov.livejournal.com
> Что вообще хорошего можно сказать про язык, в котором обычная
> переменная по умолчанию передаётся по значению, а массив - по адресы

А как ещё это можно сделать, принимая во внимание основную парадигму языка: быть как можно ближе к железяке? Это уж Природа так диктует. Это как и с векторами, меняющими размер: только два таких можно расположить в памяти, не мудрствуя лукаво насчёт её, памяти, управления, а просто расположив их по краям и дав расти друг навстречу друга.

Date: 2004-03-15 01:58 pm (UTC)
From: [identity profile] zigmar.livejournal.com
> для обектно-ориентированного программированя простой C подходит гораздо больше, чем C++
И как на с полиморфизм писать? Запонять в ручную vtables как в GTK? Нет уж, спасибо...

Насчет языков програмирования - нету языков универсальный и идеальных. Каждой задаче - свои языки.

Date: 2004-03-15 01:58 pm (UTC)
From: [identity profile] ifyr.livejournal.com
C++ -- язык с четко определенной внутренней логикой, и зная эту логику в подобные ловушки не попадаешь. Да, C# и Java проще, но C++ предоставляет намного больше возможностей, и многие вещи в нем делаются намного проще (libraries aside) учитывая наличие шаблонов и множественного наследования.

Date: 2004-03-15 02:02 pm (UTC)
From: [identity profile] ifyr.livejournal.com
Multiple inheritance применяемое с умом намного удобнее, чем трюки с аггрегацией в не поддерживающих его языках.

Чужой код, написанный с применением шаблонов отлаживается без проблем при условии квалифицированности автора (а люди с недостаточной квалификацией могут напортачить на любом языке). Взгляните хотя бы на Boost.

Date: 2004-03-15 02:06 pm (UTC)
From: [identity profile] avva.livejournal.com
Скомпилируйте с опцией -trigraphs (в других компиляторах триграфы работают по умолчанию, как стандарт и требует).
Типа g++ -o foobar -trigraphs foobar.cc

Date: 2004-03-15 02:06 pm (UTC)
From: [identity profile] avva.livejournal.com
См. мой ответ чуть ниже.
Page 1 of 6 << [1] [2] [3] [4] [5] [6] >>

February 2026

S M T W T F S
1 2 3 4 5 67
8 9 10111213 14
15 16 17 18192021
2223 2425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 24th, 2026 07:35 pm
Powered by Dreamwidth Studios