2013-03-10 5 views
1

В с:Почему различное поведение для оператора инкремента в Java и с

int a = 33; 
a = a++; 
printf("\n\t a :%d",a); // it'll print 34 

В Java:

int a = 33; 
a = a++; 
System.out.printf("\n\t a :%d",a); // it'll print 33 

Почему пост инкремент корректно работает в C и почему не в Java?

+8

http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behaviors-iiiii-etc - часть C является неопределенным поведением, вы не можете полагаться на нее (может печатать что-нибудь). Часть Java соответствует спецификации Java, т. Е. Результат, который вы видите, является ожидаемым поведением. – Mat

+0

В 'C', код, который вы опубликовали, имеет неопределенное поведение. Он не работает корректно, потому что нет определения правильного поведения для этого кода! Хотя в вашей среде он печатает 34, в других он будет печатать 33. –

+0

http://stackoverflow.com/questions/11570589/java-i-operation-explanation - для части Java – Mat

ответ

3

Хороший вопрос.

Существует разница между a++ и ++a. В Java (по крайней мере) каждый будет увеличивать переменную, но значение, представленное выражением, отличается.

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

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

Так вы приращением a 1, но затем установить его обратно к исходному значению.

От the Java Tutorial:

Операторы инкремента/декремента могут применяться до (префикс) или после (постфикс) операнда. Результат кода ++; и ++ результат; оба будут заканчиваться результатом, увеличиваясь на единицу. Единственное различие заключается в том, что префиксная версия (результат ++) оценивается с добавочным значением, тогда как постфиксная версия (результат ++) оценивает исходное значение. Если вы просто выполняете простой приращение/декремент, на самом деле не имеет значения, какую версию вы выберете. Но если вы используете этот оператор в части большего выражения, то тот, который вы выберете, может иметь существенное значение.

+1

Действительно ли это необходимо? На сайт ответили много раз, и вместо этого вы должны были помечать вопрос как дубликат. –

+4

Это не отвечает на вопрос OP, поэтому существует разница между C и Java. –