Рассмотрим этот код: int s = 20; int t = s++ + --s;. Каковы значения s и t?

переходим к делу, ответ таков: «s равно 20, а t не может быть определено». Я понимаю ту часть, что s равна 20, но почему t нельзя определить? Пожалуйста помогите!


person Eugene Pi    schedule 11.02.2013    source источник
comment
Где вы нашли ответ, который вы даете?   -  person Joachim Isaksson    schedule 11.02.2013
comment
t можно определить: ideone.com/6ja0Kv   -  person Paul Bellora    schedule 11.02.2013
comment
Вы думали, о, я не знаю, попробовать и посмотреть? не может быть определено - это ... чепуха.   -  person Brian Roach    schedule 11.02.2013
comment
Такой код никогда не пригодится в реальной жизни... зачем вам это?   -  person Jon Skeet    schedule 11.02.2013
comment
Я думаю, по можно определить, он не имеет в виду, что он запустится, а то, что он одинаков во всех средах выполнения и во всех компиляторах.   -  person Joachim Isaksson    schedule 11.02.2013
comment
@JoachimIsaksson - Тогда он ... все еще ошибается.   -  person Brian Roach    schedule 11.02.2013
comment
@BrianRoach Я почти уверен, что вы совершенно правы в том, что это является 100% определенным поведением в Java (например, в C/C++ это явно неопределенное поведение), но я бы не стал ставить на кон на нем, не глядя на спец.   -  person Joachim Isaksson    schedule 11.02.2013
comment
Q помечен как Java. Если бы это было помечено C (или что-то еще, где это не так), я бы не опубликовал это;)   -  person Brian Roach    schedule 11.02.2013
comment
@BrianRoach Я тоже могу поспорить на свой дом :) stackoverflow.com/a/4978933/477878   -  person Joachim Isaksson    schedule 11.02.2013
comment
@JoachimIsaksson - Хех, я просто копался в JLS, чтобы найти это, чтобы опубликовать ссылку на него. Я должен был догадаться, что он уже где-то здесь.   -  person Brian Roach    schedule 11.02.2013
comment
Голосование за повторное открытие: хотя выражение уродливое и не должно использоваться в реальном коде, я думаю, что этот вопрос не слишком локализован, потому что ответ заключается в том, что он хорошо определен в Java (в отличие от C или C++) и следует очень простому, естественному правила вычисления выражений, которые Java требует использовать. Как это может быть слишком локализовано, если это набор правил, которым должна следовать каждая Java-программа? Разработчикам Java важно это понимать (особенно тем, кто пришел из мира C).   -  person Michael Burr    schedule 11.02.2013
comment
Для протокола я проголосовал не за настоящий вопрос, потому что это был просто уродливый вопрос. Если бы это было написано как что-то последовательное, я бы этого не сделал. При этом я должен был закрыть его как дубликат: /questions/11629136/ (среди прочих, я уверен)   -  person Brian Roach    schedule 11.02.2013
comment
ответ взят с myprogramminglab.com / наш класс в колледже использует ресурсы с этого сайта. Меня не интересует такой код, потому что он очень запутан. но я должен отправить свою домашнюю работу, и это одна из моих домашних проблем :(   -  person Eugene Pi    schedule 11.02.2013
comment
спасибо за всех вас! s - 20, а t - 40, я понимаю! я думаю, что ответ на этом сайте был неправильным   -  person Eugene Pi    schedule 11.02.2013


Ответы (2)


int s = 20; 
int t = s++ + --s;

Работа: увеличение (пост-инкремент) с до 21 (текущее значение 20) + уменьшение (преддекремент) с до 20 (текущее значение 20).

So, t=20+20;
And s =20;

После учета приоритета и круглых скобок Java гарантирует, что выражения будут оцениваться слева направо. Например, чтобы вычислить функцию eat() + drink() — beMerry(), Java сначала вычислит функцию eat(), затем drink(), затем выполнит сложение, затем вычислит функцию beMerry() и, наконец, выполнит вычитание. eat() вычисляется перед drink(), потому что eat() находится слева от drink(), а выражения вычисляются слева направо. Эта гарантия важна, потому что вызовы eat() и drink() могут иметь побочные эффекты, которые были бы другими, если бы они вызывались в противоположном порядке.

person Achintya Jha    schedule 11.02.2013
comment
Возможно, вам захочется немного объяснить, почему вы выполняете вычисления так, как делаете (например, слева направо, а не справа налево). - person Joachim Isaksson; 11.02.2013
comment
@JoachimIsaksson Я отредактировал свой ответ, как вы сказали. Спасибо - person Achintya Jha; 11.02.2013

Прочтите это:

Поскольку оператор увеличения/уменьшения изменяет свой операнд, использование такого операнда более одного раза в одном и том же выражении может привести к неопределенным результатам. Например, в таких выражениях, как x − ++x, неясно, в какой последовательности должны выполняться операторы вычитания и приращения. Подобные ситуации усугубляются, когда компилятор применяет оптимизации, что может привести к тому, что порядок выполнения операций будет отличаться от того, что задумал программист.

Теперь ваш ответ должен быть довольно ясным. Мне кажется, что значение t может варьироваться в зависимости от компилятора/оптимизации.

Вот еще немного информации: http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Sequence-Points-Constrain-Expressions

person Matt Wolfe    schedule 11.02.2013
comment
Этот ответ действителен для C/C++, но не для Java. См. stackoverflow.com/a/4978933/477878. - person Joachim Isaksson; 11.02.2013