Solo una observación aleatoria, parece que en StackOverflow.com, hay preguntas sobre si "++ i == i ++". Sin embargo, esa pregunta se hace todo el tiempo, creo que la vi planteada unas 6 o 7 veces en los últimos 2 meses.
Me pregunto por qué los desarrolladores de C están tan interesados en él. También existe el mismo concepto / pregunta para los desarrolladores de C # y Java, pero creo que vi solo una pregunta relacionada con C #.
¿Es porque tantos ejemplos usan ++ i? ¿Es porque hay algún libro popular o tutorial? ¿Es porque a los desarrolladores de C les encanta agrupar tanto como sea posible en una sola línea para 'eficiencia' / 'rendimiento' y, por lo tanto, encuentran construcciones 'extrañas' usando el operador ++ con más frecuencia?
c
undefined-behavior
Michael Stum
fuente
fuente
++i == i++
, o más generalmente sobre la diferencia de significado entre++i
yi++
?Respuestas:
Sospecho que al menos parte de esto es un poco más simple: incluso ahora, vemos muchas preguntas como esta comenzando alrededor del comienzo del año escolar, y se van reduciendo gradualmente durante todo el año.
Como tal, creo que es justo adivinar que bastantes de ellos son simplemente el resultado de clases en las que el maestro habla al menos un poco al respecto, pero no explica muy bien su (s) punto (s). porque él realmente no los entiende). Especialmente en función de las personas que parecen hacer estas preguntas, pocas se basan en la codificación real.
fuente
Porque los programadores C TIENEN que entender el orden de las operaciones. Los desarrolladores de C # no usan necesariamente los operadores bit a bit (&, |, ~) o los operadores de prefijo, ya que normalmente estamos más preocupados por otras cosas. Sin embargo, de lo que los desarrolladores de C # no nos damos cuenta es que debemos saber qué hacen los operadores que usamos a diario y cómo usarlos correctamente. La mayoría de nosotros evitamos los lugares donde esto puede ser un problema.
Fuera de la cabeza, ¿cuál es el resultado de este fragmento?
Diría que un buen número de desarrolladores experimentados de C # no tienen idea de cuál es la salida a la consola.
fuente
if (myList[i++] == item)
. Inteligente. Lo encontré buscando la fuente de una excepción IndexOutOfRange ... De hecho, muy "inteligente".++
usado en una carroza, y debo decir que no se siente muy apropiado. ¿La gente hace eso? (Prefiero+= 1
)Creo que esto es obvio. En C #, para an
int i
,i++ == ++i
siempre es falso mientras++i == i++
que siempre es cierto, de manera confiable, y todos los interesados pueden descubrirlo fácilmente simplemente aprendiendo las reglas de C # (o simplemente ejecutándolo).En C y C ++, por otro lado, está casi indefinido porque depende del compilador, el entorno de ejecución, la plataforma, etc., por lo que es una pregunta mucho más difícil de responder, por lo que mucha gente la pregunta.
fuente
Es una pregunta popular porque es una pregunta capciosa. Es indefinido .
El enlace de arriba va a Preguntas frecuentes en la página de inicio de Bjarnes Stroustrup, que aborda esta pregunta específicamente y explica por qué esta construcción no está definida. Lo que dice es:
fuente
Lo más probable es que en C, realmente importa si escribes
i++
o++i
cuando estás haciendo aritmética de puntero. Allí, aumentandoi
antes o después de una operación podría ser crucial. Te daría un ejemplo, pero la última vez que escribí C fue hace 10 años ...En C #, nunca me he encontrado con una situación que me obligue a pensar
i++
o++i
porque AFAIK, para los bucles for / while, realmente no importa.fuente
i++
y++i
, sino combinarlos en la misma expresión.Hace unos años leí que estos operadores se consideraban peligrosos, así que traté de obtener más información al respecto. Si stackoverflow hubiera estado activo en ese momento, lo habría preguntado allí.
Ahora es porque algunas personas retorcidas escriben bucles como
Incluso ahora, no estoy muy seguro de lo que sucederá / debería suceder, pero para mí es bastante claro que múltiples ++ [var] en la misma línea están buscando problemas.
fuente
x = ++j;
están bien definidas en C. Lo anterior no está definido porquej
se modifica dos veces sin puntos de secuencia intermedios.Dos razones.
La implementación correcta de ++ i es incrementar i y luego devolverlo. La implementación correcta de i ++ es guardar el valor actual, incrementar i y devolver el valor guardado. Saber que estos no se implementan como sinónimos es importante.
La pregunta entonces es cuándo los aplica el compilador al evaluar una expresión, como la igualdad.
Si la prueba de igualdad se realiza primero, luego los operadores anteriores y posteriores al incremento, tendrá que escribir una lógica diferente que si el lado izquierdo (lhs) y el lado derecho (rhs) se evalúan primero, luego la igualdad.
Se trata del orden de las operaciones, y eso a su vez afecta el código que uno escribe. Y, como era de esperar, no todos los idiomas están de acuerdo.
La lista de pruebas básicas permite a los desarrolladores probar si sus suposiciones son correctas y si la implementación real coincide con la especificación del lenguaje.
Esto puede tener todo tipo de impacto cuando se trabaja con punteros, bucles o valores de retorno.
fuente
++i
es usar el valori+1
y en algún momento, quizás antes o después de eso, pero antes del siguiente punto de secuencia, incrementei
.Creo que es un choque cultural.
Como ya se señaló, el comportamiento de una expresión en C o C ++ puede ser indefinido porque el orden de ejecución de los incrementos posteriores, etc., no está estrictamente definido. El comportamiento indefinido es bastante común en C y, por supuesto, gran parte de eso se importó a C ++.
Para alguien que ha programado algo en otro idioma, alguien que ha captado la idea de que se supone que los lenguajes de programación son precisos y que las computadoras deben hacer lo que se les dice que hagan ... bueno, es un shock descubre que C es intencionalmente vago sobre algunas cosas.
fuente
++
y los--
operadores no se basaban en el PDP-11, que no existía cuando esos operadores se introdujeron en el lenguaje B predecesor de C Ver cm.bell-labs.com/who/dmr/chist.html , y busque "incremento automático".Tal vez es solo que los desarrolladores de C usan el incremento de ++ más a menudo en general, ya que C no tiene "foreach" o una declaración similar para recorrer los arreglos. ¡Ah, y por supuesto, el puntero aritmático, como se mencionó anteriormente!
fuente
La diferencia entre ambas partes: la publicación y el preincremento funcionan de la manera en que estas dos piezas de código deberían funcionar en todos los idiomas. ¡ESTO NO ES DEPENDIENTE DEL LENGUAJE!
Esto es pre incremento. Este fragmento de código aumentará primero el valor de
i
antes de enviar el valor a la línea donde se usa.Este es el incremento posterior. Este código devolverá el valor de
i
antes de que aumente el valor dei
en la línea donde se usa.En otro pequeño ejemplo:
Este código compila con resultados en el teclado.
Esto tiene que ver con la implementación interna de la sobrecarga del operador.
++i
aumenta directamente el valor (y, por lo tanto, es un poco más rápido)i++
primero crea una copia que se devuelve al lugar donde se necesita y luego el valor original deli
variable aumenta en uno.Espero que esto esté claro ahora.
fuente
++i
no es más rápido yi++
no crea una copia. Además, se++i
comporta de manera ligeramente diferente en C que en C ++, y mucho menos entre otros lenguajes.