2013-08-13 2 views
-3

Как интерпретировать эти операторы pre increment?
Операторы предварительного приращения имеют право налево ассоциативность, поэтому правая часть больше i будет увеличиваться или все значения i будут увеличиваться один раз?Вывод следующей программы

main() 
{ 
    int i=3,j; 
    j=++i*++i*++i; 
    printf("%d",j); 
} 

Ответ 216.

+1

№ В этом вопросе n o оператор присваивания имеет тот же оператор. У него есть один до и один пост. Исправьте меня, если я ошибаюсь. – user2531733

+0

Этот вопрос является дубликатом со вторым вопросом, точками последовательности. Не имеет значения, является ли он одним и тем же оператором или нет, поведение по-прежнему недокументировано и, следовательно, не определено. Нет ничего нового, чтобы учиться на этом вопросе, за исключением случаев, когда вы можете внести в вопрос какую-то новую информацию. Правильный ответ заключается в том, что он не документирует, как все оператор '++' будет выполняться и в каком порядке. Хотя порядок между «++» здесь не имеет значения, порядок с остальной частью выражения, но это, к сожалению, не определено. –

ответ

-1

++ i увеличивает I до операции.

Вы код эквивалентен:

int i=3,j; 
j=(i+1)*(i+2)*(i+3); 
i++;i++;i++; 
printf("%d",j); 

Этот выход будет 4 * 5 * 6 = 120

+0

Я действительно пытался - я ожидал получить, возможно, различный ответ в зависимости от параметров компилятора, из-за того, что он был неопределенным поведением - и последовательно получил * 150 * (5 * 5 * 6) на OpenSuSE 12.1 с последним 'gcc'. – LSerni

+0

Неопределенный не означает «случайный», это просто означает «недокументированный». Может быть, что * этот * компилятор всегда создает код, который возвращает 150. Проблема в том, насколько сильно вы хотите полагаться на это. –

-1

Ответ 150

ли равно (++ я * + + i) * ++ i, first ++ i увеличивает i (i = 4), второй ++ i увеличивает i (i = 5), но он тот же i, что и 5 * 5 = 25. Наконец 25 * ++ i = 150

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