Después de leer las características ocultas y oscuras esquinas de C ++ / STL sobre comp.lang.c++.moderated, me sorprendió por completo que el siguiente fragmento compila y se trabajó tanto en Visual Studio 2008 y G ++ 4.4.
Aquí está el código:
#include <stdio.h>
int main()
{
    int x = 10;
    while (x --> 0) // x goes to 0
    {
        printf("%d ", x);
    }
}
Salida:
9 8 7 6 5 4 3 2 1 0
Supongo que esto es C, ya que también funciona en GCC. ¿Dónde se define esto en el estándar y de dónde viene?
                    
                        c++
                                c
                                operators
                                code-formatting
                                standards-compliance
                                
                    
                    
                        GManNickG
fuente
                
                fuente

++o--antes ...#define upto ++<,#define downto -->. Si te sientes malvado, puedes hacerlo#define for while(y#define do ) {(y#define done ;}) y escribirfor x downto 0 do printf("%d\n", x) doneOh, la humanidad ...Respuestas:
-->No es un operador. De hecho, son dos operadores separados,--y>.El código del condicional disminuye
x, mientras devuelvexel valor original (no disminuido) y luego compara el valor original con el0uso del>operador.Para comprender mejor, la declaración podría escribirse de la siguiente manera:
fuente
while (x-- > 0)lo que sería más adecuado. También hace más obvio lo que está sucediendo (al menos en un editor de fuentes fijas), lo que significa que los paréntesis en esta respuesta no serían necesarios.O para algo completamente diferente ... se
xdesliza a0.No es tan matemático, pero ... cada imagen vale más que mil palabras ...
fuente
why waste words when a picture does a better job, utilizado como una broma en este contexto. (de hecho, hay 2 palabras clavewhileyprintf)Es un operador muy complicado, por lo que incluso ISO / IEC JTC1 (Comité Técnico Conjunto 1) colocó su descripción en dos partes diferentes del Estándar C ++.
Bromas aparte, son dos operadores diferentes:
--y se>describen respectivamente en §5.2.6 / 2 y §5.9 del Estándar C ++ 03.fuente
Es equivalente a
x--(disminución posterior) es equivalente ax = x-1esto, el código se transforma en:fuente
0 >-- xen este casoxse disminuye antes de la lógica. En postfix, la lógica se ejecuta antes de la disminución y, por lo tanto, ambas muestras son equivalentes. Siéntase libre de escribirlos en unConsoley probarlos.while(x=x-1,x+1 > 0)es equivalente.xpuede ir a cero aún más rápido en la dirección opuesta:8 6 4 2¡Puedes controlar la velocidad con una flecha!
90 80 70 60 50 40 30 20 10;)
fuente
Sus
Solo el espacio hace que las cosas se vean divertidas,
--decrecientes y>comparables.fuente
El uso de
-->tiene relevancia histórica. Disminuir fue (y sigue siendo en algunos casos), más rápido que incrementar en la arquitectura x86. El uso-->sugiere que esoxva a ser0y atrae a aquellos con antecedentes matemáticos.fuente
es cómo se analiza eso.
fuente
Completamente geek, pero usaré esto:
fuente
do ... whilees una lista de declaraciones. En C es un bloque, por lo que debe serdo { ... } while.do statement while ( expression ) ;. Dicho esto, espero que se entienda, quise decir el ejemplo como una broma.Un libro que leí (no recuerdo correctamente qué libro) decía: Los compiladores intentan analizar las expresiones al token más grande usando la regla izquierda derecha.
En este caso, la expresión:
Parses a tokens más grandes:
La misma regla se aplica a esta expresión:
Después de analizar:
Espero que esto ayude a entender la expresión complicada ^^
fuente
a-----by pensará(a--)-- - b, lo que no se compila porquea--no devuelve un valor l.xy--son dos fichas separadas.-->es un operador (que es lo que implica tener la pregunta que se le hizo), esta respuesta no es útil en absoluto: pensará que el token 2 es-->, no solo--. Si sabe que-->no es un operador, probablemente no tenga problemas para comprender el código de la pregunta, por lo tanto, a menos que tenga una pregunta completamente diferente, no estoy realmente seguro de cómo podría ser útil.aha sobrecargado el operador posterior a la disminución, que devuelve lvalue. coliru.stacked-crooked.com/a/e1effc351ae79e9fEsto es exactamente lo mismo que
para números no negativos
fuente
for(--x++;--x;++x--)?unsignedes--x++tiene un comportamiento indefinido de acuerdo con §1.9.15unsigned, lo habría usado%uDe todos modos, tenemos un operador "va a" ahora.
"-->"es fácil de recordar como una dirección, y "mientras x va a cero" tiene sentido directo.Además, es un poco más eficiente que
"for (x = 10; x > 0; x --)"en algunas plataformas.fuente
for (size_t x=10; x-->0; )el cuerpo del bucle se ejecuta con 9,8, .., 0, mientras que la otra versión tiene 10,9, .., 1. De lo contrario, es bastante complicado salir de un ciclo a cero con una variable sin signo.++>para hacer el trabajo incremental.intlo que podría comerse a su perro con la misma facilidad que llevarxa cero si comienza negativo.0. (A modo de comparación, el idioma de omitir pruebas para cero, como escribir enwhile (n--)lugar de no firmadon, no le compra nada y para mí obstaculiza enormemente la legibilidad). También tiene la agradable propiedad de que especifique uno más que el índice inicial, que generalmente es lo que que desee (por ejemplo, para un bucle sobre una matriz, especifique su tamaño). También me gusta-->sin espacio, ya que esto hace que el idioma sea fácil de reconocer.Este código primero compara xy 0 y luego disminuye x. (También se dice en la primera respuesta: estás decrementando x y luego comparando x y 0 con el
>operador). Mira la salida de este código:Ahora primero comparamos y luego disminuimos al ver 0 en la salida.
Si queremos primero disminuir y luego comparar, use este código:
Esa salida es:
fuente
Mi compilador imprimirá 9876543210 cuando ejecute este código.
Como se esperaba. El
while( x-- > 0 )realmente significawhile( x > 0). Losx--decretos posterioresx.Es una forma diferente de escribir lo mismo.
Sin embargo, es bueno que el original se vea como "mientras x va a 0".
fuente
while( x-- > 0 ) actually means while( x > 0)- No estoy seguro de lo que intentabas decir allí, pero la forma en que lo expresaste implica que--no tiene ningún significado, lo que obviamente es muy incorrecto.xserá-1después de que salga del bucle, mientras que en esta respuesta,xserá0.Falta un espacio entre
--y>.xes posterior decrementado, es decir, decrementado después de verificar la condiciónx>0 ?.fuente
#define foo()versus#define foo ().--es el operador de decremento y>es el operador mayor que .Los dos operadores se aplican como uno solo
-->.fuente
Es una combinación de dos operadores. Primero
--es para disminuir el valor, y>es para verificar si el valor es mayor que el operando de la derecha.El resultado será:
fuente
En realidad,
xestá disminuyendo posteriormente y con esa condición se está comprobando. No es-->, es(x--) > 0Nota: el valor de
xse cambia después de que se verifica la condición, porque se reduce posteriormente. Algunos casos similares también pueden ocurrir, por ejemplo:fuente
xiniciara en 1, pero lowhile ( (x--) > 0 )haría. {editar} Eric Lippert cubrió ambos en sus notas de lanzamiento de C # 4: blogs.msdn.microsoft.com/ericlippert/2010/04/01/…C y C ++ obedecen la regla de "munch máximo". De la misma manera a a b se traduce
(a--) - b, en su caso sex-->0traduce a(x--)>0.Lo que la regla dice esencialmente es que yendo de izquierda a derecha, las expresiones se forman tomando el máximo de caracteres que formarán una expresión válida.
fuente
¿Por qué toda la complicación?
La respuesta simple a la pregunta original es simplemente:
Hace lo mismo. No digo que debas hacerlo así, pero hace lo mismo y habría respondido la pregunta en una publicación.
El
x--es solo una abreviatura de lo anterior, y>es solo un normal mayor queoperator. No hay gran misterio!Hay demasiada gente haciendo las cosas simples complicadas hoy en día;)
fuente
The OP's way: 9 8 7 6 5 4 3 2 1 0yThe Garry_G way: 10 9 8 7 6 5 4 3 2 1x=x-1antes,printfentonces puedes decir "hace lo mismo".De la manera convencional, definiríamos una condición en el
whileparéntesis del bucle()y una condición de terminación dentro de los corchetes{}, pero-->define ambos a la vez.Por ejemplo:
Esto disminuye
ay ejecuta el ciclo mientrasaes mayor que0.Convencionalmente, sería como:
En ambos sentidos, hacemos lo mismo y alcanzamos los mismos objetivos.
fuente
test-write-executecomo en la pregunta, ¡gracias por señalar!(x --> 0)medio(x-- > 0)(x -->)output -: 9 8 7 6 5 4 3 2 1 0(-- x > 0)Es malo(--x > 0)output -: 9 8 7 6 5 4 3 2 1output -: 9 8 7 6 5 4 3 2 1output -: 9 8 7 6 5 4 3 2 1 0output -: 9 8 7 6 5 4 3 2 1 0output -: 9 8 7 6 5 4 3 2 1 0Del mismo modo, puede probar muchos métodos para ejecutar este comando con éxito
fuente