¿Alguien puede explicar qué está sucediendo exactamente en estas dos declaraciones enumeradas a continuación:
1) int enabled = val == 0; //val is an int
2) int sync = param || (foo->delay == NULL); //param and delay is both int
3 respuestas
int enabled = val == 0;
Leído como
int enabled = (val == 0);
Y
(val == 0)
Será 0 o no cero si val es 0 o no. enabled
se inicializará con ese valor
Equivalente a:
int enabled;
if(val == 0)
{
enabled = 1;
}
else
{
enabled = 0;
}
Ahora haces el mismo análisis en el segundo
C solo adoptó un tipo booleano verdadero de C ++ con C99, aunque lo nombró _Bool
para que no entrara en conflicto con el código preexistente y proporcionó el encabezado <stdbool.h>
para hacerlo más agradable.
La convención anterior de que solo 0
se considera falsey (un cero literal, que en un contexto de puntero es un puntero nulo), y no se cambió nada de verdad. (Eso es lo contrario a cómo lo hacen los shells de comando).
Todos los operadores booleanos y la conversión de _Bool
usan valores canónicos de 0
y 1
.
Eso debería ser suficiente historia y detalles para entender el código.
Establecerá la variable enabled
en 1
si val
es igual a 0
y 0
de lo contrario.
sync
será igual a 1
si param
no es cero y, en caso de que sea 0
, será 1
si foo->delay
es NULL
más será 0
.
De estándar §6.5.9p3 respaldando lo que dije :
Los operadores
==
(igual a) y!=
(no igual a) son análogos a los operadores relacionales, excepto por su precedencia más baja.108) Cada uno de los operadores produce 1 si la relación especificada es verdadero y 0 si es falso. El resultado tiene el tipo int. Para cualquier par de operandos, exactamente una de las relaciones es verdadera.
También en el caso ||
hay un estándar que dice la lógica de evaluación: del §6.5.14
A diferencia de los bit a bit | operador, el operador
||
garantiza una evaluación de izquierda a derecha; si se evalúa el segundo operando, hay un punto de secuencia entre las evaluaciones del primer y segundo operandos. Si el primer operando se compara desigual a 0, el segundo operando no se evalúa.
También en la misma sección, la regla que dicta cuál será el resultado si param
no es cero.
El operador
||
arrojará1
si alguno de sus operandos se compara desigual con0
; de lo contrario, produce0
. El resultado tiene el tipoint
.
Nuevas preguntas
c
C es un lenguaje de programación de uso general utilizado para la programación del sistema (SO e integrado), bibliotecas, juegos y multiplataforma. Esta etiqueta debe usarse con preguntas generales sobre el lenguaje C, como se define en el estándar ISO 9899 (la última versión, 9899: 2018, a menos que se especifique lo contrario; también etiquete las solicitudes específicas de la versión con c89, c99, c11, etc.). C es distinto de C ++ y no debe combinarse con la etiqueta C ++ en ausencia de una razón racional.