Estoy confundido entre Verdadero y Falso. ¿Un valor Verdadero significa No Cero y el valor Falso significa Cero?

¿Por qué el siguiente progtwig me da la respuesta opuesta después de realizar las operaciones de comparación?

main() { int k=35; printf("%d\n%d\n%d",k==35,k=50,k<40); } 

salida

0 50 1

Este progtwig no es un progtwig de C válido según el estándar C.
Hay 2 problemas asociados con este progtwig.

Problema 1: Comportamiento no especificado

El orden de evaluación de los argumentos de una función no está especificado [Ref 1] .

  • Podría ser de izquierda a derecha o
  • Podría ser de derecha a izquierda o
  • Cualquier otro orden mágico.

Problema 2: Comportamiento indefinido

Esto tiene un comportamiento indefinido [Ref 2] porque una variable no debe modificarse más de una vez sin un punto de secuencia intermedio. Tenga en cuenta que , en la función, los argumentos no introducen un punto de secuencia. Así, k se modifica sin un punto de secuencia intermedio y causa un comportamiento indefinido.

Por lo tanto, no puede confiar en que el comportamiento sea específico en este caso. El progtwig no es un progtwig de C válido.


[Ref 1]
Estándar C99 6.5.2.2.10:

El orden de evaluación del designador de la función, los argumentos reales y las subexpresiones dentro de los argumentos reales no está especificado, pero hay un punto de secuencia antes de la llamada real.

[Ref 2]
Estándar C99 6.5.2:

Entre el punto de secuencia anterior y el siguiente, un objeto tendrá su valor almacenado modificado a lo sumo una vez por la evaluación de una expresión. Además, solo se debe acceder al valor anterior para determinar el valor que se almacenará.


Tenga en cuenta que el comportamiento no especificado y el comportamiento no definido son términos definidos por el estándar como:

C99 Estándar 3.19 Comportamiento no especificado:

Comportamiento donde esta Norma Internacional proporciona dos o más posibilidades y no impone requisitos sobre los que se eligen en ningún caso.

C99 Estándar 3.18 Comportamiento indefinido:

comportamiento, en el uso de una construcción de progtwig no portátil o errónea, de datos erróneos, o de objetos de valor indeterminado, para los cuales esta Norma Internacional no impone requisitos

¿Notaste que el segundo argumento para printf es k = 50? Este es un comportamiento indefinido porque el orden de evaluación de los parámetros no está especificado

El orden de evaluación de los argumentos de función no está definido por el estándar C. Ver C99 §6.5.2.2p10 :

El orden de evaluación del designador de la función, los argumentos reales y las subexpresiones dentro de los argumentos reales no está especificado, pero hay un punto de secuencia antes de la llamada real.

Esto significa que cada una de las comparaciones k==35 , la asignación k=50 y la prueba k<40 pueden suceder en cualquier orden. Cuando probé su progtwig usando MSVC, la asignación ocurrió primero. Otros comstackdores, o incluso otras invocaciones del mismo comstackdor, pueden elegir diferentes órdenes.

Ojalá hubieras mostrado tu salida. Sin embargo, mi sospecha es que el problema es que has incluido una asignación como uno de los argumentos para printf (), y los cielos saben en qué orden se evaluaron los tres argumentos, es decir, k podría haber sido 50 cuando k == 35 era evaluado 😉