/* Hint: Run the thing through the pre-processor and look at
   the result */

/* The ABORT statement looks like a statement.  It's not. */

/*
Answer:
   The ABORT macro is expanded into two statements.  So the 
   result of the if is:


    if (value < 0) 
        cerr << "Illegal square root" << endl; exit (8);

 or properly indented:

    if (value < 0) 
        cerr << "Illegal square root" << endl; 
    exit (8);

From this it's easy to see why we always exit.

Avoidance: Use inline functions instead of multi-statement macros.
inline void ABORT(const char msg[]) {
    cerr << msg << endl;
    exit(8);
}
