biegnę następujące programy w Visual C++ i Java:Zachowanie PreIncrement and PostIncrement operatora w C i Java
Visual C++
void main()
{
int i = 1, j;
j = i++ + i++ + ++i;
printf("%d\n",j);
}
wyjściowa:
6
Java:
public class Increment {
public static void main(String[] args) {
int i = 1, j;
j = i++ + i++ + ++i;
System.out.println(j);
}
}
wyjściowa:
7
Dlaczego wyjście w tych dwóch językach są różne? Jak oba języki traktują inaczej operatorów przed i po cynkowaniu?
W językach C i C++ kolejność, w jakiej wyrażenia są oceniane, oraz kolejność, w jakiej stosowane są efekty uboczne, są * nieokreślone *; wynik będzie się różnić od wdrożenia do wdrożenia. Odpowiednie standardy pozostawiają takie zachowanie * niezdefiniowane *, aby implementator kompilatora nie musiał się martwić o sposób obsługi takich wyrażeń; dowolny wynik jest uważany za "prawidłowy". Java i C#, OTOH, określają, że wszystkie wyrażenia są oceniane od lewej do prawej i że wszystkie efekty uboczne są stosowane natychmiast, więc takie wyrażenia są dobrze zdefiniowane. –