Co to jest operator "-- > " w C++?
Po przeczytaniu Hidden Features and Dark Corners of C++/STL on comp.lang.c++.moderated
, byłem całkowicie zaskoczony, że poniższy fragment skompilowany i działał zarówno w Visual Studio 2008, jak i G++ 4.4.
Oto kod:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Zakładam, że jest to C, ponieważ działa również w GCC. Gdzie jest to określone w normie i skąd pochodzi?
21 answers
Zwróć uwagę
-->
nie jest operatorem. W rzeczywistości są to dwa oddzielne operatory,--
i>
.
Kod warunkowy zmniejsza x
, zwracając oryginalną (nie zmniejszoną) wartość x
, a następnie porównuje oryginalną wartość z 0
za pomocą operatora >
.
Aby lepiej zrozumieć, oświadczenie może być napisane w następujący sposób:
while((x--) > 0)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 22:44:30
Albo za coś zupełnie innego... x przesuwa się do 0
while (x --\
\
\
\
> 0)
printf("%d ", x);
Nie Takie matematyczne, ale... każdy obraz maluje tysiąc słów. ...Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-04 06:04:41
To bardzo skomplikowany operator, więc nawet ISO / IEC JTC1 (Joint Technical Committee 1) umieściło jego opis w dwóch różnych częściach standardu C++.
Są to dwa różne operatory: --
i >
opisane odpowiednio w §5.2.6 / 2 i §5.9 standardu C++03.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-02 06:49:17
Jest odpowiednikiem
while (x-- > 0)
x--
(post decrement) jest równoważne x = x-1
, więc kod przekształca się na:
while(x > 0) {
// logic
x = x-1;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-05 20:49:58
x
może iść do zera jeszcze szybciej w przeciwnym kierunku:
int x = 10;
while( 0 <---- x )
{
printf("%d ", x);
}
8 6 4 2
Możesz kontrolować prędkość za pomocą strzałki!
int x = 100;
while( 0 <-------------------- x )
{
printf("%d ", x);
}
90 80 70 60 50 40 30 20 10
;)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-11 02:51:48
To
#include <stdio.h>
int main(void){
int x = 10;
while( x-- > 0 ){ // x goes to 0
printf("%d ", x);
}
return 0;
}
Po prostu przestrzeń sprawia, że rzeczy wyglądają śmiesznie, --
dekrementy i >
porównuje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-08 17:02:25
Użycie -->
ma znaczenie historyczne. Zmniejszanie było (i nadal jest w niektórych przypadkach) szybsze niż zwiększanie na architekturze x86. Użycie -->
sugeruje, że {[2] } będzie 0
i odwołuje się do tych, którzy mają matematyczne pochodzenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-18 12:47:41
while( x-- > 0 )
Jest jak to jest analizowane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-19 19:46:56
Totalnie geek, ale będę używał tego:
#define as ;while
int main(int argc, char* argv[])
{
int n = atoi(argv[1]);
do printf("n is %d\n", n) as ( n --> 0);
return 0;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-03 02:33:05
Jedna książka, którą przeczytałem (nie pamiętam dokładnie, która książka) stwierdziła: kompilatorzy próbują parsować wyrażenia do największego tokena używając reguły left right.
W tym przypadku wyrażenie:
x-->0
Parsuje do największych tokenów:
token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0
Ta sama zasada stosuje się do tego wyrażenia:
a-----b
Po analizie:
token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b
Mam nadzieję, że to pomoże zrozumieć skomplikowane wyrażenie ^^
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 09:02:58
To jest dokładnie to samo co
while (x--)
{
printf("%d ", x);
}
Dla liczb nieujemnych
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 22:48:34
W każdym razie, mamy teraz operatora "idzie do". "-->"
łatwo zapamiętać jako kierunek, a "while x goes to zero" oznacza-prosto.
Ponadto jest nieco bardziej wydajny niż "for (x = 10; x > 0; x --)"
na niektórych platformach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-28 17:28:13
Ten kod najpierw porównuje x i 0, a następnie Dekrementuje x. (powiedział również w pierwszej odpowiedzi: po dekrementujesz x, a następnie porównujesz X i 0 z operatorem >
.) Patrz wyjście tego kodu:
9 8 7 6 5 4 3 2 1 0
Najpierw porównujemy, a następnie zmniejszamy, widząc 0 na wyjściu.
Jeśli chcemy najpierw dekrementować, a następnie porównać, użyj tego kodu:
#include <stdio.h>
int main(void)
{
int x = 10;
while( --x> 0 ) // x goes to 0
{
printf("%d ", x);
}
return 0;
}
Wyjście To:
9 8 7 6 5 4 3 2 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-03 17:48:14
Mój kompilator wydrukuje 9876543210 kiedy uruchomię ten kod.
#include <iostream>
int main()
{
int x = 10;
while( x --> 0 ) // x goes to 0
{
std::cout << x;
}
}
Zgodnie z oczekiwaniami. while( x-- > 0 )
w rzeczywistości oznacza while( x > 0)
. x--
post decrements x
.
while( x > 0 )
{
x--;
std::cout << x;
}
To inny sposób pisania tego samego.
Fajnie, że oryginał wygląda jak" while x goes to 0".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 22:49:12
Pomiędzy --
a >
brakuje spacji. x
jest post decremented, czyli decremented po sprawdzeniu stanu x>0 ?
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-22 19:02:21
--
jest operatoremdecrement i >
jest operatoremwiększym od .
Oba operatory są stosowane jako jeden, jak -->
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-29 21:42:06
Jest kombinacją dwóch operatorów. Pierwsza --
służy do zmniejszania wartości, a >
do sprawdzania, czy wartość jest większa niż prawostronny operand.
#include<stdio.h>
int main()
{
int x = 10;
while (x-- > 0)
printf("%d ",x);
return 0;
}
Wyjście będzie:
9 8 7 6 5 4 3 2 1 0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 22:50:01
Właściwie, {[1] } jest post-dekrementacja i z tym warunkiem jest sprawdzana. To nie -->
, to (x--) > 0
Uwaga: wartość x
jest zmieniana po sprawdzeniu warunku, ponieważ po jego zmniejszeniu. Niektóre podobne przypadki mogą również wystąpić, na przykład:
--> x-->0
++> x++>0
-->= x-->=0
++>= x++>=0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 09:52:33
C i C++ przestrzegają zasady "maximum munch". W ten sam sposób a - - - b jest tłumaczone na (a--) - b
, w Twoim przypadku x-->0
tłumaczy się na (x--)>0
.
Zasada mówi zasadniczo, że przechodząc od lewej do prawej, wyrażenia są tworzone przez przyjęcie maksimum znaków, które będą tworzyć poprawne wyrażenie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-12 09:55:16
Skąd te komplikacje?
Prosta odpowiedź na pierwotne pytanie brzmi:
#include <stdio.h>
int main()
{
int x = 10;
while (x > 0)
{
printf("%d ", x);
x = x-1;
}
}
Robi to samo. Nie mówiąc, że powinieneś to zrobić w ten sposób, ale robi to samo i odpowiedziałby na pytanie w jednym poście.
x--
jest tylko skrótem od powyższego, a >
jest po prostu normalnym większym niż operator
. Żadna tajemnica!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 10:10:56
W konwencjonalny sposób definiujemy warunek w nawiasie pętli while "()
"i warunek zakończenia wewnątrz nawiasu klamrowego" {}
", ale to --
& >
to sposób, w jaki definiuje się wszystkie naraz.
Dla np.:
int abc(){
int a = 5
while((a--) > 0){ // Decrement and comparison both at once
// Code
}
}
Mówi, decrement a
i uruchom pętlę do czasu a
jest większy niż 0
W inny sposób powinno być tak:
int abc(){
int a = 5
while(a > 0){
// Code
a = a -1 // Decrement inside loop
}
}
W obie strony robimy to samo i osiągamy te same cele.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 10:10:51