2013-02-11 3 views
-4

разрезать на погоню, ответ «s is 20, и t не может быть определен». Я понимаю часть, которая равна 20, но почему t невозможно определить? Пожалуйста, помогите мне!Рассмотрим этот код: "int s = 20; int t = s ++ + --s;". Каковы значения s и t?

+4

Где вы нашли ответ, который вы даете? –

+1

't' можно определить: http://ideone.com/6ja0Kv –

+2

Вы думаете, о, я не знаю, попробуй и посмотри? «невозможно определить» - это ... глупость. –

ответ

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(), затем напишет(), затем выполнит добавление, затем оценит beMerry() и, наконец, выполнит вычитание. eat() оценивается перед напитком(), потому что eat() находится слева от drink(), а выражения оцениваются слева направо. Эта гарантия важна, потому что вызовы eat() и drink() могут иметь побочные эффекты, которые могут отличаться, если они были вызваны в обратном порядке.

+1

Возможно, вы захотите объяснить little _why_ вы вычисляете, как и вы (например, слева направо, а не справа налево, например) –

+0

@JoachimIsaksson Я отредактировал свой ответ, как вы сказали. Спасибо –

0

Чтение this:

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

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

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

+3

Этот ответ действителен для C/C++, но не для Java. http://stackoverflow.com/a/4978933/477878 –

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