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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Forma de evaluación de los operandos de un operador.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Forma de evaluación de los operandos de un operador.  (Leído 1,919 veces)
fafafa01

Desconectado Desconectado

Mensajes: 82


Ver Perfil
Forma de evaluación de los operandos de un operador.
« en: 24 Enero 2017, 10:20 am »

Buenas, leyendo un libro de C, decía que solo en los operandos de los operadores ("&&","||","?:" y ",") se especifica la evaluacion de un operador.

y por lo tanto en el siguiente ejemplo:

Código
  1. a[i]=i++;
  2.  

no se sabe si el subindice es el valor antes o después del incremento.

mi duda es: como el operador [] es el de mas alta precedencia la i  seria el valor viejo cualquier sea el compilador con el que se compile.¿ es acertada la conclusion?

si en cambio, el código seria así:

Código
  1. a[i]=(i++);
  2.  

ahi el subindice si seria el nuevo ya que el operador () esta antes que el []

mi ultima duda:

si un operador unario como cast se pone al lado de una expresión compuesta
Código
  1. (int)(a+b)
  2.  

que se hace primero:
según el operador (), como la asociatividad es de izquierda a derecha, se ara el cast, pero el operador cast se evalúa de derecha a izquierda


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Forma de evaluación de los operandos de un operador.
« Respuesta #1 en: 24 Enero 2017, 15:47 pm »

Vale, eso son los puntos de secuencia.

Un punto de secuencia marca cuándo una instrucción se ha completado y no va a haber efectos secundarios en posteriores procesos.

Como has dicho el operador de asignación ( = ) no marca un punto de secuencia por lo que el compilador puede elegir arbitrariamente que parte del igual quiere resolver primero. Si es la parte izquierda no pasará nada, se dereferenciará la dirección de la variable a[i] y después pasará a la parte derecha para calcular el valor que debe asignar, por lo que el postincremento no afectará. Pero si primero decide evaluar la parte derecha para saber qué valor debe asignar, al evaluar la parte izquierda i habrá aumentado por el postincremento.

Si buscas más información sobre efectos secundarios y puntos de secuencia (sequence points) verás que la historia es bastante complicada. Basta con que te quedes que no hay que mezclar según que expresiones en una instrucción.


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Forma de evaluación de los operandos de un operador.
« Respuesta #2 en: 24 Enero 2017, 17:41 pm »

http://en.cppreference.com/w/cpp/language/operator_precedence

Esos casos no dan mucho pié a error. Un post-incremento no se ejecuta hasta el final de la instrucción/línea (de forma genérica).

Ese (i++) que pusiste, no es el operator(). "i()" es el operator (), que es como una llamada a función. Rodear unas operaciones con () no es un operador. Simplemente haces que ese bloque se ejecute completo (cuando se necesite) antes de continuar evaluando.

Para probar estas cosas de forma práctica, siempre puedes crear una clase para ello:

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Test{
  6. public:
  7. Test operator+(const Test& test){
  8. cout << " +";
  9. }
  10.  
  11. Test operator++(){
  12. cout << " ++_";
  13. }
  14.  
  15. Test operator++(int){
  16. cout << " _++";
  17. }
  18.  
  19. Test operator[](const Test& test){
  20. cout << " []";
  21. }
  22.  
  23. Test operator=(const Test& test){
  24. cout << " =";
  25. }
  26.  
  27. operator int(){
  28. cout << " int";
  29. }
  30. };
  31.  
  32. int main(){
  33. cout << "Order:";
  34.  
  35. Test a,b;
  36.  
  37. a[++a] = b++;
  38. cout << endl;
  39.  
  40. (int)(a+b);
  41. cout << endl;
  42.  
  43. (int)a+b;
  44. cout << endl;
  45. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Quitar mensaje de Evaluacion a dll
Ingeniería Inversa
jwmoreira 1 2,845 Último mensaje 11 Febrero 2009, 01:17 am
por Amerikano|Cls
Notas de evaluación Java
Java
Meta 7 6,259 Último mensaje 17 Mayo 2012, 04:20 am
por RyogiShiki
evaluacion postfija
Java
BTO911 1 9,274 Último mensaje 29 Octubre 2013, 19:37 pm
por egyware
Programa que compare operandos
ASM
zepeg 1 2,421 Último mensaje 21 Abril 2014, 03:05 am
por Eternal Idol
Ningún operador "<<" coincide con estos operandos.
Programación C/C++
lSources 2 4,260 Último mensaje 11 Abril 2018, 06:23 am
por lSources
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines