Concepts of Programming Languages

C: Statements versus Expressions

Instructor: Stefan Mitsch

Is this C?


int f (int x) {
    int y;
    if (x) y=1; else y=2;
    return y;
}
int main() { printf ("%d\n", f(5)); return 0; }
          

Is this C?


int f (int x) {
    int y;
    y = if (x) 1 else 2;
    return y;
}
int main() { printf ("%d\n", f(5)); return 0; }
          

Is this C?


int f (int x) {
    int y;
    y = x ? 1 : 2;
    return y;
}
int main() { printf ("%d\n", f(5)); return 0; }
          

Is this C?


int f (int x) {
    int y;
    y = {int z=0; while (x>0) {x--; z++;} z}
    return y;
}
int main() { printf ("%d\n", f(5)); return 0; }
          

Statements and Expressions

  • Assembly language consists of statements
  • Expressions were added later
  • Roughly:
    • Statements: should change memory
    • Expressions: should not

Pure / Side Effecting

  • A mathematical function takes arguments and gives results
  • An expression is pure if that's all it does
  • Anything else is a side effect
    • Assignment to a variable
    • Change of control (goto)
    • I/O (console, network)
    • etc.

Expressions

  • Literals (boolean, character, integer, string)
  • Operators (arithmetic, bitwise, logical)
  • Function calls
  • 
    f (1 + (2 * strlen ("hello")))
                

Statements

  • Expression statements (including assignment)
                    
    printf("hello");
    ^^^^^^^^^^^^^^^    expression
    ^^^^^^^^^^^^^^^^   statement
                    
                  
  • Return statements
                    
    return 1+x;
           ^^^    expression
    ^^^^^^^^^^^   statement
                    
                  

Statements

  • Selection statements (if-then-else; switch-case)
  • Iteration statements (while; do-while; for)
  • 
    int count = 0;
    while (1) {
      int ch = getchar();
      switch (ch) {
        case -1: return count;
        case 'a': count = count + 1;
        default: continue;
      }
    }
                

Side-Effecting Expressions


x++
          

x += 2
          

x = (y = 5)
          

x -= (y += 5)
          

Side-Effecting Expressions


int x = 1;
printf ("%d\n", ++x);   //
//
          

int x = 1;
printf ("%d\n", x++);   //
//
          

x = 1 + (y = 5);   //
          

int x = 1;
printf ("%d\n", (x = x + 1) + x);   //
          

Side-Effecting Expressions


int x = 1;
printf ("%d\n", ++x);   // pre increment, prints 2
// value of x is now 2
          

int x = 1;
printf ("%d\n", x++);   //
//
          

x = 1 + (y = 5);   //
          

int x = 1;
printf ("%d\n", (x = x + 1) + x);   //
          

Side-Effecting Expressions


int x = 1;
printf ("%d\n", ++x);   // pre increment, prints 2
// value of x is now 2
          

int x = 1;
printf ("%d\n", x++);   // post increment, prints 1
// value of x is now 2
          

x = 1 + (y = 5);   //
          

int x = 1;
printf ("%d\n", (x = x + 1) + x);   //
          

Side-Effecting Expressions


int x = 1;
printf ("%d\n", ++x);   // pre increment, prints 2
// value of x is now 2
          

int x = 1;
printf ("%d\n", x++);   // post increment, prints 1
// value of x is now 2
          

x = 1 + (y = 5);  // assigns 5 to y and 6 to x
          

int x = 1;
printf ("%d\n", (x = x + 1) + x);   //
          

Side-Effecting Expressions


int x = 1;
printf ("%d\n", ++x);   // pre increment, prints 2
// value of x is now 2
          

int x = 1;
printf ("%d\n", x++);   // post increment, prints 1
// value of x is now 2
          

x = 1 + (y = 5);  // assigns 5 to y and 6 to x
          

int x = 1;
printf ("%d\n", (x = x + 1) + x);   // no "sequence point", undefined!
          

Side-Effecting Expressions


int global = 0;

int post_inc () {
  return global++;
}

int main () {
  printf ("%d\n", post_inc () + post_inc ());
}
          

C'S Comma Operator

  • (e1, e2, ..., en)
  • e1 ... en-1 executed for side effect
  • Result is the value of en
  • Sequential execution of expressions!
  • An example:

string s; 
while(read_string(s), s.len() > 5) { 
   // do something 
} 
          

Sequencing


int main () {
  int x = 5;
  x *= 2;
  printf ("%d\n", x);
}
          

int main () {
  int x = 5;
  printf ("%d\n", (x *= 2, x));
  // behavior defined because comma operator introduces sequence point
}
          

C Expressions

  • Sequencing: e1, e2
  • Conditional: e1 ? e2 : e3
  • Variable declarations?
  • Loops?