Я думаю, что странное поведение вы задаетесь вопросом о том, из-за порядок, в котором анализируются и выполняются перенаправленные аргументы.
#include <iostream>
using namespace std;
int main()
{
int i = 1;
cout << i << i << i++ << i << i << i++ << endl;
return 0;
}
В данном конкретном случае от конкретного компилятора я использую ... (т.е. все это не определено или не определено поведение - я просто пытаюсь интерпретировать результаты Вы всегда должны избегать написания кода, который вызывает неопределенными. behavour).
Сначала оцениваются аргументы 3 и 6 (потому что у них есть операторы ++
, прикрепленные? Спасибо rodrigo).
Таким образом, самый правый i++
подходит к 1
и имеет i
as 2
.
Далее оценивается 3-й аргумент i++
, что дает 2
и оставляет i
как 3
.
Все остальные аргументы оцениваются в 3
. Вот как вы получаете выход
332331
.
Обратите внимание, что порядок оценки перенаправленных элементов не указан, то есть он может меняться от компилятора к компилятору и т. Д., Вы не можете знать, каким он будет.
Смотрите также Order of evaluation of arguments using std::cout
Как @rodrigo указывает мне, так как i
увеличивается в два раза в том же выражении результаты являются неопределенными.
Так что в игре много гремлинов, это, возможно, правильная, возможно, некорректная интерпретация того, как генерируется выход.
Почему люди настаивают на том, чтобы делать глупые вещи, а затем задавались вопросом, почему они не работают так, как они ожидают? :-) – paxdiablo
dats rude ... но зайдите и запустите код, который вы обнаружите, что он показывает странное поведение ... Мне любопытно узнать .. ПОЧЕМУ –
Этот код не относится к указателям или ссылкам вообще. Откат к второй ревизии. – soon