splincodewd
@splincodewd
Developer

Почему в потоке cout элементы выводятся в другом порядке?

#include <iostream>
using namespace std;

int main(){

	int* c = new int[3];
	c[0] = 0;
	c[1] = 1;
	c[2] = 2;

         // ждал 0 1 2
 	cout << *c << ' ' << *c++ << ' ' << *c++ <<  endl; // выводит 2 1 0

	return 0;
}


Причем, если выводить в цикле, все нормально
#include <iostream>
using namespace std;

int main(){

	int* c = new int[3];
	c[0] = 0;
	c[1] = 1;
	c[2] = 2;

	for (int i =0; i < 3; ++i){
		// *c == c[0]
		cout << *c << ' ';

		// *c++ == c[1] 
		// сместили внутренний указатель на одну позицию
		*(c++);
	}

	cout << endl;

	//cout << *c << ' ' << *c++ << ' ' << *c++ <<  endl; // 2 1 0

	return 0;
}
  • Вопрос задан
  • 339 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Дело в том, что между точками следования (это точка с запятой, вызов функции и экономные операции &&, || и ?:) компилятор имеет право переставлять операции как хочет. Вот он и решил вычислять c++ с конца.

В C++11 нет точек следования, есть «вычисляется прежде», но языка это кардинально не меняет.

В C++17 это обещают поправить.
19) In a shift operator expression E1<<E2 and E1>>E2, every value computation and side-effect of E1 is sequenced before every value computation and side effect of E2

en.cppreference.com/w/cpp/language/eval_order

ЗЫ. MinGW даже предупреждение выводит, что результат такой строчки явно не определён. И на классе Co тоже (см. флейм с Толстым Лорри).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы