Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

159
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!