2013-07-07 5 views
6

Я бегу следующие программы в Visual C++ и Java:Поведение прединкремента и PostIncrement оператора в C и Java

Visual C++

void main() 
{ 
    int i = 1, j; 
    j = i++ + i++ + ++i; 
    printf("%d\n",j); 
} 

Выход:

6 

Java:

public class Increment { 
    public static void main(String[] args) { 
     int i = 1, j; 
     j = i++ + i++ + ++i; 
     System.out.println(j); 
    } 
} 

Выход:

7 

Почему выход в этих двух языках отличаются? Как обе лангеры относились к операторам pre и postincrement по-разному?

+0

В C и C++ порядок, в котором выражены выражения, и порядок, в котором применяются побочные эффекты, являются * неуказанными *; результат будет отличаться от реализации к реализации. Соответствующие стандарты оставляют такое поведение * неопределенным *, так что разработчику компилятора не нужно беспокоиться о том, как обрабатывать такие выражения; любой результат считается «правильным». Java и C#, OTOH, укажите, что все выражения оцениваются слева направо и что все побочные эффекты применяются немедленно, поэтому выражения, подобные этому, четко определены. –

ответ

2

В C/C++ поведение не определено, потому что в этом выражении i модифицирован более чем один раз без промежуточной точки последовательности. читать: What's the value of i++ + i++?

Понятно, что поведение Java по умолчанию this kind of codes определено. Below мой ответ для Java, шаг за шагом:

В начале i is 1.

j = i++ + i++ + ++i; 
// first step, post increment 
j = i++ + i++ + ++i; 
// ^^^ 
j = 1 + i++ + ++i; 
// now, i is 2, and another post increment: 
j = i++ + i++ + ++i; 
// ^^^^^^^^^ 
j = 1 + 2 + ++i; 
// now, i is 3 and we have a pre increment: 
j = i++ + i++ + ++i; 
// ^^^^^^^^^^^^^^^^ 
j = 1 + 2 + 4; 
j = 7; 
+0

ваш ответ очень хорош для Java, я добавил для c в вашем ответе, если вам не нравится откат к вашей версии. –

4

Пример C++ вызывает неопределенное поведение. Вы не должны изменять значение более одного раза в выражении. между точками последовательности. [Отредактировано, если быть более точным.]

Я не уверен, что то же самое верно для Java. Но это, безусловно, относится к C++.

Вот хорошая ссылка:
Undefined behavior and sequence points

+1

цитирование пожалуйста? Я никогда не слышал об этом ... только, что это не рекомендуется. – Mgetz

+0

@Mgetz: Отредактировано для добавления окончательной ссылки. Прокрутите вниз до «1». Между предыдущей и следующей точками последовательности скалярный объект должен иметь значение, которое его значение хранится не более одного раза путем оценки выражения ». –

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