2016-06-24 2 views
0

Я боролся за одно утверждение. Когда я выполняю это (похожее) в C и PHP, я получаю ответ как 5. Но тот же код дает 4 в Java. Может кто-нибудь объяснить эту разницу.Результат, отличный от C, PHP, java

int x=1,y=1; 
x+=y+=x+=y; 

Мы обеспокоены значением x после этого выполнения.

+2

В C все правильно, потому что это вызывает * неопределенное поведение *. – MikeCAT

+0

Ошибка анализа в PHP. – AbraCadaver

+0

Offcourse, это будет, поскольку не добавлен знак $. Но у меня это работает со мной с выходом 5 – Atif

ответ

2

В C поведение выражения x+=y+=x+=y: undefined; буквально любой результат возможен. Проблема заключается в том, что, за небольшим исключением, C не указывает порядок, в котором выражения оцениваются или применяются побочные эффекты; нет гарантии, что x или y обновляются в любом конкретном порядке (оператор += не вводит точку последовательности). Таким образом, результат будет варьироваться между платформами, сборками и т. Д. Он даже не должен быть таким же от запуска до запуска, хотя на практике это будет.

Да, выражение разбирает в x+=(y+=(x+=y)), но это не означает, что значение x обновляется сразу после крайний правый x+=y оценивается.

Вот один можно последовательность оценок и побочных эффектов, которые могут объяснить вывод:

t0 <- x + y // t0 == 2 
t1 <- y + t0 // t1 == 3 
y <- t1  // y == 3 
x <- t0  // x == 2 
x <- x + t1 // x == 5 

В отличие от C, Java заставляет конкретный порядок оценки и побочные эффекты (все вычисляются слева направо, сбоку эффекты применяются немедленно), поэтому результат хорошо определен в Java.

Не знаю, как PHP.

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