versiones sistemas sistema qué que provienen parte operativo mayor los licencia las informacion herramientas forman entre distribuye diferencias bajo c gcc

c - sistemas - sistema operativo linux



¿Qué significa !!(x) en C(especialmente el kernel de Linux)? (3)

No es tanto una sintaxis de lenguaje sino una abreviatura común para convertir un char o int en cuasi-booleano.

En C operaciones lógicas como == &&! y así sucesivamente puede actuar en int, char, etc., ya que no existe un tipo booleano, sin embargo, según el estándar, se garantiza que devolverán 0 para False y 1 para verdadero.

Entonces, por ejemplo, si tiene

int x = 5;

puede obligarlo a convertir a un tipo "booleano" (no hay ningún tipo booleano en C, por lo tanto, las comillas) lo hace

x = !x; /* !5 which gives 0 always */ x = !x; /* which gives 1 always */

He estado leyendo el kernel de Linux (específicamente, 2.6.11). Me encontré con la siguiente definición:

#define unlikely(x) __builtin_expect(!!(x), 0)

(de linux-2.6.11 / include / linux / compiler.h: enlace 61 lxr )

Que hace !! ¿realizar? ¿Por qué no usar (x)?

Ver también:


!!(x) es equivalente a (x) != 0 (a menos que ocurra una sobrecarga de operador muy extraña en C ++).

El hecho de que no sea obvio lo que está haciendo !!(x) es probablemente una buena razón para usar (x) != 0 . A menos que quieras ser un hacker de kernel de élite.

Vea esta pregunta cerrada (si todavía está disponible) para una discusión sobre los méritos de !! (Tal vez esa pregunta será reabierta, ya que esta pregunta indica que tiene algún valor).


!!(x) fuerza a ser 0 o 1. 0 sigue siendo 0, pero cualquier valor distinto de cero (que sería ''verdadero'' en un contexto booleano) se convierte en 1.