Маленькая и довольно неприятная проблема, которую я видел несколько дней назад, спросил у моего друга на собеседовании.
Первоначальный вопрос интервью был: «Каким будет вывод следующего кода?»
int i = 2;
i = i++ + i++;
Правильный ответ ((2 + 2) + 1) + 1 = 6, т. Е. Постинкремент применяется дважды до назначения, но после добавления.
Затем я хотел создать простой класс, содержащий одно целое число и оператор перегрузки + () и оператор ++ (int), чтобы видеть в журналах точный порядок, в котором будут выполняться операторы.
Вот что я получил:
class A
{
public:
A(int _data) : data(_data) { }
A &operator=(const A& _rhs)
{
data = _rhs.data;
cout<<" -- assign: "<<data<<endl;
}
A operator++(int _unused)
{
A _tmp = data;
data++;
cout<<" -- post-increment: "<<data<<endl;
return _tmp;
}
A operator+(const A &_rhs)
{
A _tmp = data + _rhs.data;
cout<<" -- addition: "<<data<<"+"<<_rhs.data<<endl;
return _tmp;
}
inline operator int() const { return data; }
private:
int data;
};
Результат был довольно обескураживающим:
-- post-increment: 3
-- post-increment: 4
-- addition: 3+2
-- assign: 5
Для менее сложных конструкций, таких как (A _dt2 = a ++;), он действует как следует, но порядок выполнения операторов не такой, как для целочисленных типов.
Это может быть специфическая проблема компилятора, я думаю:
$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Итак, я немного растерялся:)