cout << i++ << i--
семантически эквивалентно
operator<<(operator<<(cout, i++), i--);
<------arg1--------->, <-arg2->
$ 1.9/15- «Когда ca заполняя функцию (или нет функции инлайн), каждое вычисление значения и побочного эффекта, связанного с любым выражением аргумента или с выражением постфикса, обозначающое называемой функцией , секвенируют, прежде чем выполнения каждого выражения или инструкция в теле вызываемой функция. [Примечание: вычисления значений и побочные эффекты, связанные с , выражают разные аргументы . -end отметить]
C++ 0x:
Это означает, что оценка аргументов arg1/arg2 являются unsequenced (ни один из них секвенировали до другого).
В том же раздел в проекте стандарт также говорится,
Если побочный эффект от скалярного объекта unsequenced по отношению к любому другому побочному эффекту на тот же скалярном объект или вычисление стоимости с использованием значение того же скалярного объекта, поведение не определено.
В настоящее время существует точка последовательности в точку с запятой в конце полного выражения ниже
operator<<(operator<<(cout, i++), i--);
^the interesting sequence point is right here
Как видно, оценка как arg1 и arg2 приводят к побочным эффектом на скалярной переменной «я ', и, как мы видели выше, побочные эффекты не имеют последствий.
Поэтому код имеет неопределенное поведение. Так что это значит?
Вот как определяется «неопределенное поведение» :) в стандарте.
Допустимое неопределенное поведение диапазоны от игнорирования ситуации полностью с непредсказуемыми результатами, чтобы Нахождения в процессе перевода или программе исполнения в документированной манере характеристики окружающей среды (с или без выдачи диагностики сообщение), до завершения перевода или исполнения (с сообщением ). Многие ошибочные программные конструкции делают не порождают неопределенное поведение; они должны быть диагностированы .
Вы видите корреляцию с @ ответ DarkDust в 'Компилятор даже позволил установить ваш компьютер в огне :-)
Таким образом, любой вывод, который вы получите от такого кода на самом деле в страшном царстве неопределенное поведение.
Не делайте этого.
Единственное, что defined
примерно такой код является то, что он помогает OP и многие из нас получают много голосов (если правильно ответили) :)
* «Поведение после приращения prinf» * Вы не используете 'printf'. Вы используете потоки ввода-вывода. –
Это относится к категории тех, кто заботится. Глупый вопрос задал миллион раз, прежде чем сделать быстрый поиск, и вы увидите. Но даже если бы это было определено, вы все равно не делали бы этого в реальной жизни, чтобы снова заботиться. –
@Martin: lol ... может добавить тег «who-cares»? Это было бы весело. Я подумывал о добавлении «не-снова!». тег тоже. –