Tener cuidado acerca de precedencia de * y ++ en C / C ++, (y cualquier pulsación de tecla cuando la programación) [cerrada]

StackOverflow https://stackoverflow.com/questions/3110140

Pregunta

Alguien escribir esta función

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    *p++;                //<-- Line to pay attention
  }
}

Me pregunté, ¿por qué se pone el * p ++ antes?

Respuesta: porque "Es lo mismo", me corrigió el código y luego seguir enojado por un tiempo, debido a que ambos realmente funcionan de la misma ...

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    p++;                //<-- Line to pay attention
  }
}

Así que me gustaría compartir esto con stackoverflow, ejemplo:

Char s [6] = "Hola";

¿Qué hacer?

*++ptr;

Esto ++ evaluar la validez de la subasta (el puntero) y luego el operador eliminar la referencia *, lo que permite a un valor Char 'e' (segunda carta de "hola") (que no se utiliza en este caso y podría generar una advertencia de compilación) y el puntero estará apuntando desde la 'e' (posición 1)

¿Qué hacer?

*ptr++;

Esto es un poco raro porque va a evaluar el operador para deshacer referencias * En primer lugar, lo que le permitirá un valor Char 'h' (que se utiliza ni en este caso), y luego el post-incremento ++ (al puntero ), por lo que (de nuevo) el puntero estará apuntando desde el 'e' (posición 1)

¿Qué hacer?

ptr++;

Por último no va a tener un valor izquierdo del carbón, pero no generará ningún aviso si no se utiliza, y el puntero se apunta desde la 'e' (posición 1) también.

Estas tres formas hace lo mismo desde el punto de vista de la dirección de puntero ..

En mi humilde opinión Eso es lo peor de algunos lenguajes de programación (casi todos) ..

"Hay una mala distancia de Hamming entre cualquier código y cualquier error"

No tenemos ninguna redundancia cuando la programación, si se toma un libro de Derecho, y escribir caracteres aleatorios dentro, Será fácil de leer, pero si escribe al azar cuando la programación, se obtiene un error, 100% de precisión

¿Fue útil?

Solución

++ tiene prioridad sobre *. Pero estoy de acuerdo, no está claro cuando se mezclan ambos en el mismo comunicado.

Otros consejos

De acuerdo con la prioridad de los operadores en C, ++ evaluará primero, y sólo entonces *. Así que en *p++, ptr obtendrá su valor inceremented, y luego la declaración obtendrá el valor de la opbject a la que ptr ahora apunta a. Por supuesto, esto no es diferente de ptr++, ya que no se está utilizando el valor de la declaración.

Cualquiera que mezclas ++, -., + =, Etc con otros operadores ya ha fallado escribir código legible, el hecho de que van a error a cabo no es más que su debida

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top