What are ‘statement expressions’ in GCC?

Lots of “modern” languages, like Rust, have converted statement syntax-forms into expressions. For example, if/else, which in C is a statement form, is in Rust a ternary expression. For another example, a series of expressions separated by semicolons becomes another expression, where in C this would be a compound statement.

GCC has a non-standard extension, statement exprs, which provides something similar: the ability to put a compound statement in an expression position. Example:

#include <stdio.h>
int main() {
  int x = ({ printf("lhs\n"); int y = 2; y*y; }) + ({ printf("rhs\n"); 5; });
  printf("x = %d\n", x);
  return 0;
}

which prints:

% ./a.out
lhs
rhs
x = 9

Notice that this printed lhs before rhs, so the left-hand operand of + was evaluated before the right-hand operand. You must not rely on this behavior! The evaluation order of two operands is unspecified in C. We could just as easily have received the print statements in the opposite order.

👋 I'm Jim, a full-stack product engineer. Want to build an amazing product and a profitable business? Read more about me or Get in touch!

More by Jim

Tagged #gcc, #c, #programming, #semantics. All content copyright James Fisher 2016. This post is not associated with my employer. Found an error? Edit this page.