CS 509, Advanced Programming II

Fall 2001 - Test 1


  1. A colleague of yours believes that using declarations do not obey block scope. Write a small piece of code, which, when compiled, will convincingly demonstrate that your friend's belief is wrong.


    #include <iostream>
    
    void t(void) {
      { using std::out;
        cout << "hello\n";   // Ok.
      }
      cout << "hello\n";     // Not ok.
      }
    


  2. Explain whether or not the following statement is correct:

    const int i;
    


    The declaration statement doesn't assign i a value. the statement should be

    const int i = expr;


  3. Given the following code

    int main() {
      int a[] = { 0, 1, 2, 3 };         // Note that a[i] == i for 0 <= i < 4.
      int i, j, k;
    
      i = j                             // Assume 0 <= j < 4; 
      k = ?;	                    // The mystery statement.
      if ((a[j] == j) && (k == j + 1))
        cout << "Yes!\n";
      }
    

    which, if any, of the following expressions could be substituted for the ? in the mystery statement to have the program print Yes! when run:

    a) a[i++]++
    b) a[++i]++
    c) ++a[i++]
    d) ++a[++i]

    Justify your answer.


    The expression i++ returns the value of j, which means that both a[i++]++ and ++a[i++] are equivalent to a[j]++ and ++a[j] respectively. Either of these two expressions increases the value of a[j] by one, which would make a[j] == j be false. Replacing ? with either a or c would not print Yes!.

    The expression ++i returns the value of j + 1, which means that both a[++i]++ and ++a[++i] are equivalent to a[j + 1]++ and ++a[j + 1] respectively. The value of a[j + 1] is j + 1, so a[j + 1]++ sets k to j + 1 and ++a[j + 1] sets k to j + 2. Substituting d for ? makes k == j + 1 false, while substituting b for ? makes k == j + 1 true.

    Substituting b for ? makes both a[j] == j and k == j + 1 true, printing Yes!.


  4. Explain whether or not the following statement is syntactically correct.

    if (b-expr) ;

    Assume b-expr is any syntactically correct boolean expression.


    It's syntactically correct, although logically nonsensical. A semicolon with no statement is known as a empty statement. Because errant semicolons are a source of subtle programming errors, the preferred way to indicate empty statements is with a pair of braces:

    if (b-expr) { }



This page last modified on 21 September 2001.