elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  otra manera de escribir *envp++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: otra manera de escribir *envp++  (Leído 7,068 veces)
7emiliosk8

Desconectado Desconectado

Mensajes: 73


Ver Perfil
otra manera de escribir *envp++
« en: 5 Febrero 2017, 04:28 am »

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





En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #1 en: 5 Febrero 2017, 17:14 pm »

Código
  1. ... *var++ ...

Es lo mismo que hacer
Código
  1. ... *var ...
  2. ++var;


En línea

7emiliosk8

Desconectado Desconectado

Mensajes: 73


Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #2 en: 5 Febrero 2017, 17:46 pm »

Código
  1. ... *var++ ...

Es lo mismo que hacer
Código
  1. ... *var ...
  2. ++var;

Gracias, pero tengo una duda, el codigo era:
Citar
printf("%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 ?
« Última modificación: 5 Febrero 2017, 20:21 pm por 7emiliosk8 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #3 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.
En línea

7emiliosk8

Desconectado Desconectado

Mensajes: 73


Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #4 en: 6 Febrero 2017, 03:41 am »

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?
« Última modificación: 6 Febrero 2017, 03:43 am por 7emiliosk8 » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #5 en: 6 Febrero 2017, 15:17 pm »

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.
En línea

7emiliosk8

Desconectado Desconectado

Mensajes: 73


Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #6 en: 6 Febrero 2017, 18:23 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!
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #7 en: 6 Febrero 2017, 19:02 pm »

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.
En línea

7emiliosk8

Desconectado Desconectado

Mensajes: 73


Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #8 en: 6 Febrero 2017, 23:19 pm »

Muchas gracias por toda la ayuda!!
« Última modificación: 7 Febrero 2017, 00:58 am por 7emiliosk8 » En línea

7emiliosk8

Desconectado Desconectado

Mensajes: 73


Ver Perfil
Re: otra manera de escribir *envp++
« Respuesta #9 en: 7 Febrero 2017, 21:00 pm »

@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?
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Hay alguna otra manera de saltar a una linea nueva?
PHP
extreme69 1 2,166 Último mensaje 5 Marzo 2012, 13:51 pm
por WHK
Escribir META DESCRIPCION de un sitio de manera cómoda, segun contenido.
Desarrollo Web
Skeletron 7 3,589 Último mensaje 7 Junio 2013, 00:19 am
por Skeletron
Otra manera de ver los navegadores de internet
Noticias
wolfbcn 1 2,755 Último mensaje 29 Agosto 2013, 09:28 am
por do-while
Hay manera de encender el portátil de otra manera? « 1 2 3 »
Windows
BlackMorror5 20 9,436 Último mensaje 13 Abril 2022, 22:33 pm
por stack
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines