otra manera de escribir *envp++

Iniciado por 7emiliosk8, 5 Febrero 2017, 04:28 AM

0 Miembros y 1 Visitante están viendo este tema.

7emiliosk8

C, hola, de que otra manera puedo escribir esa notacion ? no entiendo ya que se supone que al hacer *envp++ es como si estumiera incrementando adentro del printf la variable :s por que cuando uno tiene por ejemplo int i, y luego hace i++ es lo mismo que tener i = i+1;, pero yo probe poniendo *envp = *envp + 1 y no funciona, tampoco funciona poniendo *envp = *(envp+1) :s




MAFUS

... *var++ ...

Es lo mismo que hacer
... *var ...
++var;

7emiliosk8

#2
Cita de: MAFUS en  5 Febrero 2017, 17:14 PM
... *var++ ...

Es lo mismo que hacer
... *var ...
++var;


Gracias, pero tengo una duda, el codigo era:
Citarprintf("%s\n",*envp++);


y tu me dices que es lo mismo que poner
... *var ...
++var;

pero si lo pongo asi tambien funciona :S
... *var ...
++*var;

porque ocurre eso ?

MAFUS

Si miras la tabla de prioridad de operadores de C verás que * y ++ tienen la misma prioridad y se evalúan de derecha a izquierda. Además de esto hay que recordar que el postincremento aumenta la variable después de que esta haya devuelto su valor.

Juntando todo esto tenemos que:
1. *envp++ -> Una expresión para operar
2. envp++ -> Evaluados los operadores que afectan a la variable se toma es postincremento.
3. Como envp++ es un postincremento primero se tomará el valor.
4. *envp -> Se toma el valor de la variable (una dirección de memoria) y se ejecuta el operador *, consiguiendo el valor que guarda dicha dirección.
5. envp++ -> Se termina de ejecutar el operador de postincremento sobre la variable y la hace apuntar a la siguiente posición de memoria.

7emiliosk8

#4
Cita de: MAFUS en  5 Febrero 2017, 23:58 PM
Si miras la tabla de prioridad de operadores de C verás que * y ++ tienen la misma prioridad y se evalúan de derecha a izquierda. Además de esto hay que recordar que el postincremento aumenta la variable después de que esta haya devuelto su valor.

Juntando todo esto tenemos que:
1. *envp++ -> Una expresión para operar
2. envp++ -> Evaluados los operadores que afectan a la variable se toma es postincremento.
3. Como envp++ es un postincremento primero se tomará el valor.
4. *envp -> Se toma el valor de la variable (una dirección de memoria) y se ejecuta el operador *, consiguiendo el valor que guarda dicha dirección.
5. envp++ -> Se termina de ejecutar el operador de postincremento sobre la variable y la hace apuntar a la siguiente posición de memoria.

Gracias por ser el unico en responder amigo, para ver si entendi, todos esos pasos ocurren por el hecho de estar dentro del printf ? , es decir si no tuviese ese printf y declarase en el main char *hola++, ahi simplemente incrementa de una vez la variable hola porque no hay nada mas que hacer ?

y otra cosa, si yo hubiese querido que se incrementase inmediatamente antes de hacer el printf ? como hubiese sido esa notacion ? en vez de poner esto
printf("%s",*envp++);   como seria?

MAFUS

En referente a tu primera pregunta: así es. De hecho la instrucción seguiría todos los pasos que te he dicho, pero al no haber nadie recogiendo el valor de ésta, el efecto final sería solo el incremento.

En referente a tu segunda pregunta: La instrucción sería ... *++envp .... De nuevo los operadores se evalúan de derecha a izquierda, por lo tanto ++ tiene prioridad sobre *. Como ++ en este caso es preincremento se ejecuta enseguida y después entrega el valor, que será pasado a * para conseguir el valor de la nueva dirección de memoria.

7emiliosk8

Cita de: MAFUS en  6 Febrero 2017, 15:17 PM
En referente a tu segunda pregunta: La instrucción sería ... *++envp .... De nuevo los operadores se evalúan de derecha a izquierda, por lo tanto ++ tiene prioridad sobre *. Como ++ en este caso es preincremento se ejecuta enseguida y después entrega el valor, que será pasado a * para conseguir el valor de la nueva dirección de memoria.

Buenos dias, gracias por responder de nuevo, pero una cosa que no logro entender es a que te refieres con de derecha a izq, ya que en ambos casos
*envp++
*++envp
la operacion ++ esta por delante del *  o sea en los dos casos tiene prioridad :s por que en la primera es entonces post incremento y en la otra pre ?

Ojala me entiendas, saludos!

MAFUS

Sigue este enlace, contiene la prioridad y precedencia de los operadores.
http://maxus.fis.usal.es/fichas_c.web/03xx_pags/0303.html
De izquierda a derecha quiere decir que :
A op1 B op2 C
Si op1 y op2 tienen misma prioridad primero se operará op1 y después op2.

De derecha a izquierda quiere decir que
A op1 B op2 C
Si op1 y op2 tienen misma prioridad primero se operará op2 y después op1.

Sobre tu última pregunta:
Sí primero se ejecuta el ++ pero el que esté en preincremento o postincremento produce efectos en tiempos diferentes.

7emiliosk8

#8
Muchas gracias por toda la ayuda!!

7emiliosk8

@MAFUS , una ultima cosa :D

en este codigo str = *envp++;

lo que primero esta haciendo es asignar el valor de *envp a str y luego incrementar envp una vez?