Definindo dupla exclamação?

Eu entendo o que um ponto de exclamação duplo faz (ou eu acho que entendo), mas não tenho certeza de como ele é definido em um objeto aleatório. Por exemplo, no trecho de código abaixo:

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

if (!a)
   return true;

Como sei qual será o valor do duplo ponto de exclamação? Em outras palavras, isso sempre se converte em verdadeiro? falso? ou você pode definir um comportamento para isso, como executar um método para determinar o resultado (como o objeto sabe como agir nessa situação)? Estou um pouco confuso sobre este pedaço de código devido a todas essas coisas de exclamação acontecendo ... Qualquer explicação é apreciada.

Espero que eu tenha sido claro e obrigado.

questionAnswers(7)

yourAnswerToTheQuestion