CS 509, Advanced Programming II

Fall 2001 - Test 5


  1. The following is a specification for constant-folding an equation:

    The following code is supposed to implement constant-folding for equations as given by the specification:

    bool equation::constant_fold(void) {
      return lhs->constant_fold() || rhs->constant_fold();
      }
    

    Does the code implement the specification? Explain.


    The code does not implement the specification. The problem arises from the logical or operator ||. Logical or is a short-circuiting operator, that is, when evaluating a || b, a is evaluated first and, if true, b is not evaluated (because the or of a true value with anything is true).

    This short-circuit behavior causes problems in equation::constant_fold() when lhs->constant_fold() returns true, because then rhs->constant_fold() is never called, which is contrary to the specification that both sides of the equation be folded.

    Unfortunately, the question as it appeared on the test had a typo in it: I forgot the rhs-> before the second fold_constant() call. Correct answers based on the typo also received full credit.

    This question is based, of course, on an error I made while coding up the fourth assignment.


  2. Given that p and q have type T*, explain what the value p - q represents. Are there are any other conditions that must hold for your answer to be correct? If so, what are they?


    The expression p - q gives the number of elements between p and q, including the element *p but not the element *q (or vise versa if you prefer).

    However, for p - q to have a meaningful value, both p and q must point to elements in the same array.

    Many people wrote only that that p - q is the difference between p and q without giving the units or mentioning that it's a non-inclusive difference.


  3. Given the code

    double student_info::grade() const {
      return ::grade();
      }
    

    explain the use of :: in the return statement.


    The second scope operator refers to the grade() procedure in the program's global scope. It is used to jump around the local definition of student_info::grade(); without the ::, the inner call to grade() would refer to the local definition and infinite recursion would result.

    Almost nobody noted that ::grade() is an access to global scope; many people claimed the std name space was somehow involved, which it isn't.


  4. Explain the difference between the statement

    char * cp = new char[30];
    

    and the statement

    char * cp = new char(30);
    


    The first statement defines an array of 30 characters, each element of which is undefined. The second statement defines an array of 1 character, which is initialized to the character equivalent to the integer value 30 (which is a non-printing ASCII character).

    This was straight out of the book (page 183, or §10.4/183 I suppose). This question is amusing because it came from a 305 student. He came into my office and asked me for help in figuring out why his program was crashing. It took me about five minutes before I noticed that he had typed new char(30) rather than new char[30].



This page last modified on 6 December 2001.