2012-07-03 2 views
1

Возможные Дублировать:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
Is there any difference between the Java and C++ operators?унарные операторы в Java против C++

Почему унарный операторы дают разный результат в C++ и Java?

Проверьте это:

int i = 1; 
i = i++ + ++i; 
print i (with cout or println) 

В ява: печатает

В C++: печатает

Почему?

+5

Это печатает '4' для меня на Java. – Keppil

+3

Это «неопределенное поведение». Есть много, много сообщений. Быстрый поиск предлагает http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points и http://stackoverflow.com/questions/4638364/undefined-behavior-and-sequence-points-reloaded to начните с. Также обратите внимание, что я получаю '5' с g ++. – BoBTFish

+0

@ Daniel Fischer: jdk1.6.0_31 – Keppil

ответ

9

В C++ поведение оператора, такого как i = i++ + ++i;, на самом деле не определено, поэтому тот факт, что поведение отличается, не так уж и удивительно.

На самом деле не должно быть удивительно, если два разных C++ - компилятора производят другое поведение для оператора C++ i = i++ + ++i;.

Связанный вопрос:

+5

Java _actually_ указывает значение этого выражения, где C++ оставляет его компилятору. –

+0

C++ фактически оставляет это на аппаратном уровне. У Java нет этой проблемы, она работает только на JVM. –

+1

@BoPersson: Я не думаю, что речь идет об оборудовании. – nhahtdh

0
i = i++ + ++i; 

результаты в неопределенном поведении, а значит, вы можете получить различные результаты с различными компиляторами или разными настройками компилятора.

+1

Я считаю, что он неопределен, а не неопределен. Unspecified означает, что компилятор должен выбрать что-то и сделать это последовательно. Undefined означает, что вы сами ... – BoBTFish

+1

@BoBTFish, нет, стандарт говорит: «1.3.13 неуказанное поведение [defns.unspecified] поведение, для хорошо сформированной программы и правильных данных, которая зависит от реализация. Реализация не требуется для документирования поведения. ". С другой стороны, неопределенное поведение - «1.3.12 неопределенное поведение [defns.undefined] поведение, например, может возникнуть при использовании ошибочной конструктивной программы или ошибочных данных, для которых этот международный стандарт не устанавливает никаких требований». , Линия i = i ++ + ++ i; это правильная программа, поэтому это неуказанное поведение. – SingerOfTheFall

+0

У меня нет цитаты из стандарта, но цитата из Bjarne - хорошее начало: «В основном, на C и C++, если вы дважды читаете переменную в выражении, где вы также ее пишете, результат не определен. ' http://www2.research.att.com/~bs/bs_faq2.html#evaluation-order – BoBTFish

1

это лучше объяснить с этим кодом:

int i = 1; 
int j =0; 
j = i++ + ++i; 
print j (with cout or println) 

В Java двутавровых ++ и ++ у меня есть один и тот же результат, я увеличивается на 1, так что вы делаете: 2 + 3 = 5 я буду 5 впоследствии , j будет 5 после этого

в C++ i ++ и ++ i ведут себя по-другому i ++ приращения на месте, в то время как ++ i постепенно увеличивается.

так он читает 2 + 2. J будет 4 и я буду 5.

+1

Вы ошибаетесь в отношении Java, это 1 + 3, а не 2 +3, поэтому результат 4 не 5. –

1

C++ и Java являются различными языками так что есть другой эффект. См. Приоритет операторов.

В Java ++ (постфикс и префикс) находятся на одной строке, а на C++ - с разным приоритетом.

1

В Java, пост исправить приращение ++ оператора несколько «атомный» (не резьб связанный смысл) в том смысле, что значение вычисляется в выражение и приращение происходит без вмешательства других операторов.

Operator precedence table из Википедии.

i = i++ + ++i 
i = ((i++) + (++i)) 
i = (1 + (++i)) // i = 2 
i = (1 + 3) // i = 3 
i = 4 

Для C поведение стандартно не определено.

Operator precedence из Википедии.

0
int i = 1; 
i = i++ + ++i; 
System.out.println(i); 

int i = 1; 
int j = i++ + ++i; 
System.out.println(j); 

дают всегда потому, что в Java parse expression слева направо (LALR).

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