Czy instrukcje złożone (bloki) są otoczone wyrażeniami parens w ANSI C?

Przeglądanie źródeł jądra Linuksa, które znalazłemjakiś fragment kodu gdzie blok instrukcji otoczony nawiasem jest traktowany jako wyrażeniea la lisp (lub ML), czyli wyrażenie, którego wartością jest wartość ostatniego wyrażenia.

Na przykład:

int a = ({
    int i;
    int t = 1;
    for (i = 2; i<5; i++) {
        t*=i;
    }
    t;
});

Patrzyłem naGramatyka ANSI C próbując dowiedzieć się, jak ten fragment kodu zmieści się w drzewie analizy, ale nie udało mi się.

Czy ktoś wie, czy takie zachowanie jest wymagane przez standard lub czy jest to osobliwość GCC?

Aktualizacja: Próbowałem z flagą -edantic i kompilator daje mi teraz ostrzeżenie:

warning: ISO C forbids braced-groups within expressions

questionAnswers(2)

yourAnswerToTheQuestion