Definiowanie podwójnego wykrzyknika?

Rozumiem, co robi podwójny wykrzyknik (lub myślę, że rozumiem), ale nie jestem pewien, jak jest zdefiniowany na losowym obiekcie. Na przykład we fragmencie kodu poniżej:

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

if (!a)
   return true;

Skąd mam wiedzieć, jaka będzie wartość podwójnego wykrzyknika? Innymi słowy, czy zawsze jest konwertowany na true? fałszywe ? lub czy możesz zdefiniować dla niego zachowanie, takie jak wykonanie metody w celu ustalenia wyniku (w jaki sposób obiekt wie, jak działać w tej sytuacji)? Jestem trochę zdezorientowany tym fragmentem kodu ze względu na te wszystkie wykrzykniki, które mają miejsce .. Wszelkie wyjaśnienia są doceniane.

Mam nadzieję, że było jasne i dzięki.

questionAnswers(7)

yourAnswerToTheQuestion