Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Category:

C++ (программистское)

Проверьте себя: сумеете ли вы правильно ответить, не запуская, что должна напечатать эта программа:

    #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++.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 146 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →