Puntos de secuencia en C | Serie 1

En esta publicación, intentaremos cubrir muchas preguntas ambiguas como las siguientes.

Adivina la salida de los siguientes programas.

// PROGRAM 1
#include <stdio.h>
int f1() { printf ("Geeks"); return 1;}
int f2() { printf ("forGeeks"); return 1;}
int main() 
{ 
  int p = f1() + f2();  
  return 0; 
}
  
// PROGRAM 2
#include <stdio.h>
int x = 20;
int f1() { x = x+10; return x;}
int f2() { x = x-5;  return x;}
int main()
{
  int p = f1() + f2();
  printf ("p = %d", p);
  return 0;
}
  
  
// PROGRAM 3
#include <stdio.h>
int main()
{
   int i = 8;
   int p = i++*i++;
   printf("%d\n", p);
}

La salida de todos los programas anteriores es indefinida o no especificada . La salida puede ser diferente con diferentes compiladores y diferentes máquinas. Es como preguntar el valor de una variable automática indefinida.

La razón del comportamiento indefinido en el PROGRAMA 1 es que el operador ‘+’ no tiene un orden de evaluación estándar definido para sus operandos. Primero se puede ejecutar f1() o f2(). Entonces, la salida puede ser «GeeksforGeeks» o «forGeeksGeeks».
Similar al operador ‘+’, la mayoría de los otros operadores similares como ‘-‘, ‘/’, ‘*’, Bitwise AND &, Bitwise OR |, .. etc. no tienen un orden estándar definido para la evaluación de sus operandos .

La evaluación de una expresión también puede producir efectos secundarios. Por ejemplo, en el programa 2 anterior, los valores finales de p son ambiguos. Dependiendo del orden de evaluación de la expresión, si f1() se ejecuta primero, el valor de p será 55, de lo contrario, 40.

La salida del programa 3 tampoco está definida. Puede ser 64, 72, o tal vez algo más. La subexpresión i++ provoca un efecto secundario, modifica el valor de i, lo que conduce a un comportamiento indefinido ya que también se hace referencia a i en otra parte de la misma expresión.

A diferencia de los casos anteriores, en ciertos puntos específicos de la secuencia de ejecución llamados puntos de secuencia , se garantiza que se completarán todos los efectos secundarios de las evaluaciones anteriores . Un punto de secuencia define cualquier punto en la ejecución de un programa de computadora en el que se garantiza que se habrán realizado todos los efectos secundarios de las evaluaciones anteriores y que aún no se han realizado efectos secundarios de las evaluaciones posteriores. Los siguientes son los puntos de secuencia enumerados en el estándar C:

— El final del primer operando de los siguientes operadores:
a) AND lógico &&
b) OR lógico ||
c) condicional?
d) coma,

Por ejemplo, se garantiza que la salida de los siguientes programas será «GeeksforGeeks» en todos los compiladores/máquinas.

// Following 3 lines are common in all of the below programs
#include <stdio.h>
int f1() { printf ("Geeks"); return 1;}
int f2() { printf ("forGeeks"); return 1;}
  
// PROGRAM 4
int main() 
{ 
   // Since && defines a sequence point after first operand, it is 
   // guaranteed that f1() is completed first.
   int p = f1() && f2();  
   return 0; 
}
  
// PROGRAM 5
int main()
{
   // Since comma operator defines a sequence point after first operand, it is
   // guaranteed that f1() is completed first.
  int p = (f1(), f2());
  return 0;
}
  
  
// PROGRAM 6
int main() 
{ 
   // Since ? operator defines a sequence point after first operand, it is 
   // guaranteed that f1() is completed first.
  int p = f1()? f2(): 3;  
  return 0; 
}

— El final de una expresión completa. Esta categoría incluye las siguientes declaraciones de expresión
a) Cualquier declaración completa que termine con punto y coma como “a = b”;
b) sentencias return
c) Las expresiones de control de las sentencias if, switch, while o do-while.
d) Las tres expresiones en una instrucción for.

La lista anterior de puntos de secuencia es parcial. Cubriremos todos los puntos de secuencia restantes en la próxima publicación sobre Punto de secuencia.

Referencias:
http://en.wikipedia.org/wiki/Sequence_point
http://c-faq.com/expr/seqpoints.html
http://msdn.microsoft.com/en-us/library/d45c7a5d(v= vs.110).aspx
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n925.htm

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *