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) done
Oh, la humanidad ...Respuestas:
-->
No es un operador. De hecho, son dos operadores separados,--
y>
.El código del condicional disminuye
x
, mientras devuelvex
el valor original (no disminuido) y luego compara el valor original con el0
uso 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
x
desliza 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 clavewhile
yprintf
)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-1
esto, el código se transforma en:fuente
0 >-- x
en este casox
se 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 unConsole
y probarlos.while(x=x-1,x+1 > 0)
es equivalente.x
puede 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 esox
va a ser0
y atrae a aquellos con antecedentes matemáticos.fuente
es cómo se analiza eso.
fuente
Completamente geek, pero usaré esto:
fuente
do ... while
es 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-----b
y pensará(a--)-- - b
, lo que no se compila porquea--
no devuelve un valor l.x
y--
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.a
ha 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--)
?unsigned
es--x++
tiene un comportamiento indefinido de acuerdo con §1.9.15unsigned
, lo habría usado%u
De 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.int
lo que podría comerse a su perro con la misma facilidad que llevarx
a 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.x
será-1
después de que salga del bucle, mientras que en esta respuesta,x
será0
.Falta un espacio entre
--
y>
.x
es 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,
x
está disminuyendo posteriormente y con esa condición se está comprobando. No es-->
, es(x--) > 0
Nota: el valor de
x
se cambia después de que se verifica la condición, porque se reduce posteriormente. Algunos casos similares también pueden ocurrir, por ejemplo:fuente
x
iniciara 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-->0
traduce 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 0
yThe Garry_G way: 10 9 8 7 6 5 4 3 2 1
x=x-1
antes,printf
entonces puedes decir "hace lo mismo".De la manera convencional, definiríamos una condición en el
while
paréntesis del bucle()
y una condición de terminación dentro de los corchetes{}
, pero-->
define ambos a la vez.Por ejemplo:
Esto disminuye
a
y ejecuta el ciclo mientrasa
es mayor que0
.Convencionalmente, sería como:
En ambos sentidos, hacemos lo mismo y alcanzamos los mismos objetivos.
fuente
test-write-execute
como 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 1
output -: 9 8 7 6 5 4 3 2 1
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
output -: 9 8 7 6 5 4 3 2 1 0
Del mismo modo, puede probar muchos métodos para ejecutar este comando con éxito
fuente