Definiendo doble exclamación?

Entiendo lo que hace un signo de exclamación doble (o creo que lo entiendo) pero no estoy seguro de cómo se define en un objeto aleatorio. Por ejemplo, en el fragmento de código a continuación:

Assignment *a;
if (!getAssignment(query, a))
   return false;
hasSolution = !!a;

if (!a)
   return true;

¿Cómo sé qué valor tendrá el signo de exclamación doble? En otras palabras, ¿siempre se convierte en verdadero? falso? o ¿puede definir un comportamiento para él, como ejecutar un método para determinar el resultado (cómo sabe el objeto cómo actuar en esta situación)? Estoy un poco confundido acerca de esta pieza de código debido a todas estas cosas de exclamación en curso ... Cualquier explicación es apreciada.

Espero que haya sido claro y gracias.

Respuestas a la pregunta(7)

Su respuesta a la pregunta