Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

150
Vistas
¿Los separadores de coma en la definición de tipo en C garantizan el orden?

Los operadores de coma tienen la precedencia más baja y la asociatividad de izquierda a derecha, por lo que esto garantiza el orden como:

 i = ++j, j = i++;

i será 2, y luego j será 1 después de esta declaración si i y j son 0 al principio.

Sin embargo, ¿los separadores de coma en la definición de tipo en C también garantizan el orden? Como

 int i = 1, j = ++i;
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Tu ejemplo con el operador coma, i = ++j, j = i++; , está bien definido porque el operador de coma es un punto de secuencia.

La precedencia/asociatividad no es suficiente para garantizar esto: son diferentes al orden de evaluación y los puntos de secuencia. Por ejemplo, i * 2 + i++ * 3 no está definido porque no hay puntos de secuencia.


La coma separadora entre declaradores , por ejemplo, int i = 1, j = i++; , es también un punto de secuencia. Esto está cubierto por C11 6.7.6/3, C99 6.7.5/3:

Un declarante completo es un declarante que no forma parte de otro declarante. El final de un declarador completo es un punto de secuencia.

Entonces, hay un punto de secuencia después de i = 1 , y este código está bien definido.


Sin embargo, la coma separadora entre los argumentos de función f(i, i++) no es un punto de secuencia; por lo que el código provoca un comportamiento indefinido.


Nota: En C11, el término punto de secuencia se reemplazó principalmente con relaciones de secuenciación más complicadas para especificar claramente un modelo de subprocesos, pero eso no afecta la discusión anterior.

over 4 years ago · Santiago Trujillo Denunciar

0

Sí, y aquí está la razón. Piensa en lo que dice la coma. Todo lo que dice es "oye, tengo una cosa que quiero hacer en el lado izquierdo de esta coma, una vez que hagas eso, ve a la cosa de la derecha y haz eso también. También puedes pensar en ello como una forma más corta de hacer esto

 int i = 1; int j = i++;

i ya se ha asignado en algún lugar de la memoria, por lo que todo lo que sucede con j es que toma ese valor almacenado en i, lo incrementa y lo establece igual a j.

Así que en el caso de

 int i = 1, j = ++i;

Todo lo que está diciendo es crear un número entero, establecerlo igual a uno, ahora pasar al siguiente comando, que será un int llamado j, y establecerlo igual a lo que sea i cuando se incremente.

Entonces, para responder completamente a su pregunta, sí, garantiza el orden porque el compilador ejecutará todo de arriba hacia abajo, de izquierda a derecha, a menos que se indique lo contrario.

over 4 years ago · Santiago Trujillo Denunciar

0

Suponiendo que C funciona igual que C# a este respecto, los valores separados por comas (int i = 0, j = 0;) deben permanecer en orden.

La diferencia en i++ vs ++i es el tiempo de validación:

 int i = 0; bool iGTZ = i++ > 0;//false i = 0; iGTZ = ++i > 0;//true

Un poco más de lo que pediste pero el orden de declaración está garantizado. Y si usted o alguien que lee esto no lo sabía, espero que ayude. :)

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda