2015-10-09 6 views
5

я прочитал в книге следующее заявление:побочные эффекты, точки последовательности и неопределенное поведение

n = ((i++) > (j)?(i++):(j)); 

Книга утверждает, что полагая I> J, п имеет неожиданное значение и я увеличивается в два раза.
Я не понимаю, почему n после этого утверждения имеет ожидаемое значение.
Я прочитал много примеров о непредсказуемом поведении, так что здесь моя теории (не объяснение книги, так как там нет) и скажите мне ли я право:

первых, (я ++)> (j), и i может или не может быть увеличен до .
Предполагается, что i> n, (i ++) следует оценить. Мы еще не знаем , был ли я еще прирост или нет, поэтому весь этот оператор не определен. мы не уверены, вернется ли i или i + 1.

Теперь вот проблема предполагая мою теорию прав - Почему мы не знаем, ли я был еще или нет увеличивается? Если бы эта строка кода была записана как оператор if, я уверен, что мне придется увеличивать ее раньше. Так почему же соединение, если оно отличается?

Спасибо.

+2

Вы уже ответили на свой вопрос в названии. Читайте о точках последовательности. – Olaf

+0

@ WumpusQ.Wumbley: Спасибо, CV отозван. – Olaf

+0

«Так почему же соединение, если оно отличается?» Это? http://port70.net/~nsz/c/c11/n1570.html#6.5.15p4 – Olaf

ответ

5

Оператор ?: вводит точку последовательности, поэтому здесь нет неопределенного поведения.

(i++) > (j) оценивается и применяется побочный эффект i++. Если результат (i++) > (j) истинен, то (i++) оценивается снова, иначе (j) оценивается снова.

i++ evalutes к значению iдо приращение. Таким образом, если предположить, i > j, то после оценки

n = i++ > j ? i++ : j; 

следующее должно быть истинным:

n = iorig + 1 
i = iorig + 2 

Редактировать

Chapter and verse

6.5.15 Условный оператор
...
4 Первый операнд оценивается; существует точка последовательности между ее оценкой и оценкой второго или третьего операнда (в зависимости от того, что оценивается). Второй операнд оценивается только в том случае, если первый сравнивает не равный 0; третий операнд оценивается только в том случае, если первое сравнивается с 0; результатом является значение второго или третьего операнда (в зависимости от того, что оценивается), преобразованного в тип, описанный ниже. 110)
110) Условное выражение не дает значения lvalue.
+0

@JeffY: 6.5.15/4: «Первый операнд оценивается, * есть точка последовательности между его оценкой и оценка второго или третьего операнда * (в зависимости от того, что оценивается)». –

+0

Исправить. Оригинал удален, чтобы избежать путаницы. –

+0

@JohnBode Вау, я думаю, вы все просто ошиблись в книге (C Programming, Modern Approch 2nd Edition, с.323, если вам интересно). Возможно, эта точка последовательности после 1-го операнда является новой для C99 или что-то еще, и эта книга также охватывает старый C89. В любом случае, большое вам спасибо! –

Смежные вопросы