LINUX.ORG.RU

вопрос по С++ (операторные функции)


0

0

Вопрос такой почему ++ не увеличивает значени в той-же строке, и почему operator int() вызываеться раньше ++?

///выдает такое
///operator int()
///operator++
///10
///10
///operator int()
///operator++
///11
///11

#include <iostream>

using std::cout;
using std::endl;


class INT{
int a;
public:
INT(const int ia) : a(ia) { };

int operator++(int){
cout << "operator++"<< endl;
return a++;
}
int operator++(){
cout << "++operator" << endl;
return ++a;
}

operator int(){
cout << "operator int()" << endl;
return a;
}
};

int main(){
INT as(10);
cout << (as.operator++(NULL)) << endl << as << endl;
cout << (as++) << endl << as << endl;
return 0;
};

Видимо потому, что аргументы вычисляет с конца.

Legioner ★★★★★
()

заботай разницу между префиксным и постфиксным инкрементом (++a и a++), и всё поймешь. любой учебник.

anonymous
()
Ответ на: комментарий от placement_new

> int вызывается раньше потому что << это не точка следования, и последовательность вывода тут не определна

всё чётко определено: постфиксный ++ выполяется последним в выражении. << - это обычный оператор, часть выражения.

anonymous
()
Ответ на: комментарий от anonymous

///почему тогда тут не так? int a = 0; cout << a++ << a << endl; //где разница?

hello_world
() автор топика
Ответ на: комментарий от anonymous

> всё чётко определено: постфиксный ++ выполяется последним в выражении. << - это обычный оператор, часть выражения.

нет.

во первых, в случае с объектами нет разницы между пре- и пост- инкрементами. Это просто функции, хотя и обычно разные.

cout << (as++) << endl << as << endl;

это эквивалентно:

f(f(f(f(cout, g(as)), endl), as), endl);

где f -- это operator<<

а g -- это operator++

Видимо, второй as приводится к инту до вызова g.

Перепишем выражение чтобы показать явно преобразование:

f(f(f(f(cout, g(as)), endl), r(as)), endl);

Может ли быть r вызвано до g? Может, тут не определен порядок.

dilmah ★★★★★
()
Ответ на: удаленный комментарий

он вызывавется в cout << as; потому что для твоего INT не перегружен <<

placement_new ★★
()
Ответ на: удаленный комментарий

если дело в порядке вызова то почему в начале выводит operator int() , затем выводит operator++ , и лишь потом 10 10?

hello_world
() автор топика

ok, я подсмотрел шпаргалку, отвечаю ещё раз.

Постфиксный ++ работает следующим образом: 1. Результат - значение операнда ДО инкремента; 2. Операнд увеличивается на 1 ПОСЛЕ того, как было использован результат.

В приведённом примере:

cout << (as++) << as;

Имеем следующий порядок: Встречаем оператор ++, результат его применения, попадающий к << - это исходное значение as. Сначала нужно использовать значение, потом выполнить инкремент, поэтому откладываем вызов operator ++(), и переходим к <<. Для вывода в cout нужно преобразовать INT в int, поэтому вызываем int(). Выполнили <<. Теперь результат ++ использован, и можно выполнять инкремент. Вызываем operator ++().

Это к вопросу о том, почему ++ вызывается после int(). Другой вопрос - почему в одних случаях во второй << попадает изменённое значение, а в других - нет. Тут у меня нет ответа. Предполагаю, что в этом случае поведение будет implementation defined (undefined - вряд ли).

anonymous
()
Ответ на: комментарий от placement_new

> dilmah все написал ж

dilmah неправильно написал. Для объектов между ++a и a++ такая же разница, как и для простых типов. Что мы, собственно, и наблюдаем.

anonymous
()
Ответ на: комментарий от hello_world

вообще, что-то я затупил. на предыдущие два анонимных поста забейте. молчу.

anonymous
()
Ответ на: комментарий от hello_world

кстати, скомпилируй такое с флагами -Wall -Wextra

int a = 0;
cout << a++ << " " << a << endl;

напишет: warning: operation on ‘a’ may be undefined

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.