Я бегу следующие программы в 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 по-разному?
В C и C++ порядок, в котором выражены выражения, и порядок, в котором применяются побочные эффекты, являются * неуказанными *; результат будет отличаться от реализации к реализации. Соответствующие стандарты оставляют такое поведение * неопределенным *, так что разработчику компилятора не нужно беспокоиться о том, как обрабатывать такие выражения; любой результат считается «правильным». Java и C#, OTOH, укажите, что все выражения оцениваются слева направо и что все побочные эффекты применяются немедленно, поэтому выражения, подобные этому, четко определены. –