... i przegłosowanie pierwszej z identycznych odpowiedzi, aby dostać się ...
skaffman
9
najszybszy zdobądź łupy, sortuj według najstarszych, kliknij „głosuj”. ohowoho.
dotjoe,
1
Byłem pewien, że to mam! Odpowiedź Emila i tak jest lepsza.
Victor,
Odpowiedzi:
290
++ x nazywa się preinkrementacją, a x ++ postincrement.
int x =5, y =5;System.out.println(++x);// outputs 6System.out.println(x);// outputs 6System.out.println(y++);// outputs 5System.out.println(y);// outputs 6
+1 Wiele przykładów, to jest wyjaśnienie z przykładami :)
Jeremy Smyth
1
Tak, skończyło się też na tym, że głosowałem za tym z powodu jasnego wyjaśnienia prozy na początku. (Hmm, nie wiedziałem, że w dzisiejszych czasach można pisać kursywą w komentarzach ... super )
Jonik
17
Są one znane jako operatory przyrostków i przedrostków. Oba dodają 1 do zmiennej, ale istnieje różnica w wyniku instrukcji.
int x =0;int y =0;
y =++x;// result: y=1, x=1int x =0;int y =0;
y = x++;// result: y=0, x=1
@Tom, właśnie zastanawiałem się, jak oddać głosy, więc oto moja interpretacja: jednym małym powodem, dla którego wolę odpowiedź Emila H. jest to, że jego przykładowy kod jest / nieco / bardziej pouczający.
Jonik,
Jonik. To prawda, obejmuje również słowa kluczowe „preincrement” i „postincrement”.
Tom
Ta „odpowiedź” po prostu podaje wynik testu i uważam, że dane wyjściowe nie są odpowiedziami. Wręcz przeciwnie, zwykle (nieoczekiwany) wynik wykonania jakiegoś kodu prowadzi do pytania. Stąd mój głos negatywny.
Alberto de Paola
8
Wylądowałem tutaj z jednego z jego ostatnich dupków i chociaż na to pytanie nie ma odpowiedzi, nie mogłem się powstrzymać od dekompilacji kodu i dodania „jeszcze jednej odpowiedzi” :-)
Aby być dokładnym (i prawdopodobnie nieco pedantycznym),
int y =2;
y = y++;
jest wkompilowany w:
int y =2;int tmp = y;
y = y+1;
y = tmp;
Jeśli javacta Y.javaklasa:
publicclass Y {publicstaticvoid main(String[]args){int y =2;
y = y++;}}
i javap -c Yotrzymujesz następujący kod jvm (pozwoliłem mi skomentować główną metodę za pomocą specyfikacji Java Virtual Machine Specification ):
publicclass Y extends java.lang.Object{public Y();Code:0: aload_01: invokespecial #1;//Method java/lang/Object."<init>":()V4:returnpublicstaticvoid main(java.lang.String[]);Code:0: iconst_2 // Push int constant `2` onto the operand stack. 1: istore_1 // Pop the value on top of the operand stack (`2`) and set the// value of the local variable at index `1` (`y`) to this value.2: iload_1 // Push the value (`2`) of the local variable at index `1` (`y`)// onto the operand stack3: iinc 1,1// Sign-extend the constant value `1` to an int, and increment// by this amount the local variable at index `1` (`y`)6: istore_1 // Pop the value on top of the operand stack (`2`) and set the// value of the local variable at index `1` (`y`) to this value.7:return}
++ x jest postacią prefiksu:
zwiększa wyrażenie zmiennej, a następnie używa nowej wartości w wyrażeniu.
Na przykład, jeśli jest używany w kodzie:
int x =3;int y =++x;//Using ++x in the above is a two step operation.//The first operation is to increment x, so x = 1 + 3 = 4//The second operation is y = x so y = 4System.out.println(y);//It will print out '4'System.out.println(x);//It will print out '4'
x ++ jest postfiksem:
wartość zmiennej jest najpierw używana w wyrażeniu, a następnie jest zwiększana po operacji.
Na przykład, jeśli jest używany w kodzie:
int x =3;int y = x++;//Using x++ in the above is a two step operation.//The first operation is y = x so y = 3//The second operation is to increment x, so x = 1 + 3 = 4System.out.println(y);//It will print out '3'System.out.println(x);//It will print out '4'
Mam nadzieję, że to jest jasne. Uruchomienie i zabawa z powyższym kodem powinno pomóc w zrozumieniu.
Tak, używając ++ X, w wyrażeniu zostanie użyty X + 1. Używając X ++, X zostanie użyte w wyrażeniu, a X zostanie zwiększone dopiero po oszacowaniu wyrażenia.
Więc jeśli X = 9, używając ++ X, zostanie użyta wartość 10, w przeciwnym razie wartość 9.
Tak, zwracana wartość to odpowiednio wartość po i przed przyrostem.
classFoo{publicstaticvoid main(String args[]){int x =1;int a = x++;System.out.println("a is now "+ a);
x =1;
a =++x;System.out.println("a is now "+ a);}}
$ java Foo
a is now 1
a is now 2
OK, wylądowałem tutaj, ponieważ ostatnio napotkałem ten sam problem podczas sprawdzania klasycznej implementacji stosu. Przypominam tylko, że jest to używane w implementacji stosu opartej na tablicach, która jest nieco szybsza niż w przypadku listy połączonej.
Kod poniżej, sprawdź funkcje push i pop.
publicclassFixedCapacityStackOfStrings{privateString[] s;privateint N=0;publicFixedCapacityStackOfStrings(int capacity){ s =newString[capacity];}publicboolean isEmpty(){return N ==0;}publicvoid push(String item){ s[N++]= item;}publicString pop(){String item = s[--N];
s[N]=null;return item;}}
Tak, jest różnica, w przypadku x ++ (postincrement), wartość x zostanie użyta w wyrażeniu, a x zostanie zwiększona o 1 po ocenie wyrażenia, z drugiej strony ++ x (preincrement), x + W wyrażeniu zostanie użyty 1. Brać przykład:
publicstaticvoid main(String args[]){int i , j , k =0;
j = k++;// Value of j is 0
i =++j;// Value of i becomes 1
k = i++;// Value of k is 1System.out.println(k);}
Pytanie zostało już udzielone, ale pozwólcie, że dodam również z mojej strony.
Przede wszystkim ++ oznacza wzrost o jeden, a - oznacza zmniejszenie o jeden.
Teraz x ++ oznacza przyrost x po tej linii, a ++ x oznacza przyrost x przed tą linią.
Sprawdź ten przykład
classExample{publicstaticvoid main (String args[]){int x=17,a,b;
a=x++;
b=++x;System.out.println(“x=”+ x +“a=”+a);System.out.println(“x=”+ x +“b=”+b);
a = x--;
b =--x;System.out.println(“x=”+ x +“a=”+a);System.out.println(“x=”+ x +“b=”+b);}}
Ta odpowiedź byłaby jeszcze lepsza, gdyby towarzyszyła jej kilka słów wyjaśnienia.
Thom,
0
W przypadku i ++ nazywa się to postincrement, a wartość jest używana w jakimkolwiek kontekście następnie zwiększana; ++ i to preinkrementacja, która najpierw zwiększa wartość, a następnie używa jej w kontekście.
Jeśli nie używasz go w żadnym kontekście, nie ma znaczenia, czego używasz, ale postincrement jest używany zgodnie z konwencją.
Odpowiedzi:
++ x nazywa się preinkrementacją, a x ++ postincrement.
źródło
tak
++ x zwiększa wartość x, a następnie zwraca x
x ++ zwraca wartość x, a następnie zwiększa
przykład:
po uruchomieniu kodu a i b będą równe 1, ale x będzie równe 2.
źródło
Są one znane jako operatory przyrostków i przedrostków. Oba dodają 1 do zmiennej, ale istnieje różnica w wyniku instrukcji.
źródło
suffix
?Tak,
wydrukuje
6
iwydrukuje
5
.źródło
Wylądowałem tutaj z jednego z jego ostatnich dupków i chociaż na to pytanie nie ma odpowiedzi, nie mogłem się powstrzymać od dekompilacji kodu i dodania „jeszcze jednej odpowiedzi” :-)
Aby być dokładnym (i prawdopodobnie nieco pedantycznym),
jest wkompilowany w:
Jeśli
javac
taY.java
klasa:i
javap -c Y
otrzymujesz następujący kod jvm (pozwoliłem mi skomentować główną metodę za pomocą specyfikacji Java Virtual Machine Specification ):Tak więc w końcu mamy:
źródło
Rozważając, co właściwie robi komputer ...
++ x: załaduj x z pamięci, zwiększ, użyj, zapisz z powrotem do pamięci.
x ++: załaduj x z pamięci, użyj, inkrementuj, zapisz z powrotem do pamięci.
Rozważ: a = 0 x = f (a ++) y = f (++ a)
gdzie funkcja f (p) zwraca p + 1
x będzie równe 1 (lub 2)
y będzie 2 (lub 1)
I w tym tkwi problem. Czy autor kompilatora przekazał parametr po pobraniu, po użyciu lub po zapisaniu.
Ogólnie rzecz biorąc, po prostu użyj x = x + 1. Jest to o wiele prostsze.
źródło
W Javie istnieje różnica między x ++ i ++ x
++ x jest postacią prefiksu: zwiększa wyrażenie zmiennej, a następnie używa nowej wartości w wyrażeniu.
Na przykład, jeśli jest używany w kodzie:
x ++ jest postfiksem: wartość zmiennej jest najpierw używana w wyrażeniu, a następnie jest zwiększana po operacji.
Na przykład, jeśli jest używany w kodzie:
Mam nadzieję, że to jest jasne. Uruchomienie i zabawa z powyższym kodem powinno pomóc w zrozumieniu.
źródło
Tak.
źródło
Tak, używając ++ X, w wyrażeniu zostanie użyty X + 1. Używając X ++, X zostanie użyte w wyrażeniu, a X zostanie zwiększone dopiero po oszacowaniu wyrażenia.
Więc jeśli X = 9, używając ++ X, zostanie użyta wartość 10, w przeciwnym razie wartość 9.
źródło
Jeśli jest podobny do wielu innych języków, możesz spróbować:
Jeśli powyższe nie ma miejsca, mogą być równoważne
źródło
Tak, zwracana wartość to odpowiednio wartość po i przed przyrostem.
źródło
OK, wylądowałem tutaj, ponieważ ostatnio napotkałem ten sam problem podczas sprawdzania klasycznej implementacji stosu. Przypominam tylko, że jest to używane w implementacji stosu opartej na tablicach, która jest nieco szybsza niż w przypadku listy połączonej.
Kod poniżej, sprawdź funkcje push i pop.
źródło
Tak, jest różnica, w przypadku x ++ (postincrement), wartość x zostanie użyta w wyrażeniu, a x zostanie zwiększona o 1 po ocenie wyrażenia, z drugiej strony ++ x (preincrement), x + W wyrażeniu zostanie użyty 1. Brać przykład:
źródło
Pytanie zostało już udzielone, ale pozwólcie, że dodam również z mojej strony.
Przede wszystkim ++ oznacza wzrost o jeden, a - oznacza zmniejszenie o jeden.
Teraz x ++ oznacza przyrost x po tej linii, a ++ x oznacza przyrost x przed tą linią.
Sprawdź ten przykład
Da następujący wynik:
źródło
W przypadku i ++ nazywa się to postincrement, a wartość jest używana w jakimkolwiek kontekście następnie zwiększana; ++ i to preinkrementacja, która najpierw zwiększa wartość, a następnie używa jej w kontekście.
Jeśli nie używasz go w żadnym kontekście, nie ma znaczenia, czego używasz, ale postincrement jest używany zgodnie z konwencją.
źródło
Istnieje ogromna różnica.
Ponieważ większość odpowiedzi wskazywała już na teorię, chciałbym wskazać prosty przykład:
Teraz zobaczmy
++x
:źródło