Learn more about Russian war crimes in Ukraine.

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
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.

What can computers do? What are the limits of mathematics? And just how busy can a busy beaver be? This year, I’m writing Busy Beavers, a unique interactive book on computability theory. You and I will take a practical and modern approach to answering these questions — or at least learning why some questions are unanswerable!

It’s only $19, and you can get 50% off if you find the discount code ... Not quite. Hackers use the console!

After months of secret toil, I and Andrew Carr released Everyday Data Science, a unique interactive online course! You’ll make the perfect glass of lemonade using Thompson sampling. You’ll lose weight with differential equations. And you might just qualify for the Olympics with a bit of statistics!

It’s $29, but you can get 50% off if you find the discount code ... Not quite. Hackers use the console!

More by Jim

Tagged . All content copyright James Fisher 2016. This post is not associated with my employer. Found an error? Edit this page.