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++.
From: [identity profile] ex-matiouch.livejournal.com
Слушай, я заинтересовался — и попробовал на перле. Поскольку я — совершеннейший профан в скриптовых языках, вероятнее всего — где-то облажался. Но:#!/usr/local/bin/perl
$i = 1;
$i += ++$i + $i++;
print "i = ".$i."\n";

[am@/tmp]$ perl tst.pl
i = 8
From: [identity profile] kukutz.livejournal.com
Да вроде всё верно.

В php всё вычисляется согласно мануалу и логике головы:
Идём справа.
$i++ - постинкремент, возвращает 1, в $i - 2.
++$i - преинкремент, возвращает 3, в $i - 3.
$i += - это $i = $i + , справа от плюса 3+1, $i равно 3.

Итого 7.

А какая логика в перле, я не в курсе.

Кстати, а сколько получается в Java и прочих упомянутых тобой компиляторах?

Кстати,
<script>
var i = 1;
i += ++i + i++;
alert(i);
</script>

в Javacript - 5.
From: [identity profile] ex-matiouch.livejournal.com
gcc: 7
java: 5 (наверное, правый инкремент в правой части выполняется после всего остального, что достаточно логично)
MS VC — не помню точно, но вроде бы — 4 (инкрементируется всё независимо от единицы, потом складывается).
From: [identity profile] kukutz.livejournal.com
У меня впечатление, что 5 в JavaScript потому, что i += она разворачивает в что-то типа i = 1 +
From: [identity profile] ex-matiouch.livejournal.com
Очевидно, нет.

Попробуй
int i = 5;
i += 5;
alert(i);


Причина та же, что и в Javaя так думаю inew = iold + right-part-result.
From: [identity profile] kukutz.livejournal.com
Я ровно это и имел в виду, только сказал более непонятно.
From: [identity profile] ex-matiouch.livejournal.com
Вот за это ты кошек и не любишь?

;-)

Да уж, с интерпретатором тут спокойнее.

Но я бы тому, кто такое пишет — яйца отрывал вне зависимости от того, что напечатает результирующий printf...
From: [identity profile] ex-matiouch.livejournal.com
А вот как Перл получил восьмерку — для меня загадка загадок.
From: [identity profile] kukutz.livejournal.com
Для меня, право слово, тоже.

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. 25th, 2026 10:58 am
Powered by Dreamwidth Studios