Expresiones "j = ++ (i | i); y j = ++ (i & i); ¿debería ser un error de valor l?

Esperaba eso en mi siguiente código:

#include<stdio.h> 
int main(){
    int i = 10; 
    int j = 10;

    j = ++(i | i);
    printf("%d %d\n", j, i);

    j = ++(i & i);
    printf("%d %d\n", j, i);

    return 1;
}

expresionesj = ++(i | i); yj = ++(i & i); producirá errores de valor como a continuación:

x.c: In function ‘main’:
x.c:6: error: lvalue required as increment operand
x.c:9: error: lvalue required as increment operand   

Pero me sorprendió que el código anterior se compilara con éxito, de la siguiente manera:

~$ gcc x.c -Wall
~$ ./a.out 
11 11
12 12   

Comprobarel código anterior funciona correctamente.

Mientras que otros operadores producen error (como yo entiendo). Incluso el operador bit a bit XOR causa un error.j = ++(i ^ i); (consultar otralos operadores producen un error de valor en tiempo de compilación).

¿Cual es la razon? ¿Esto es no especificado o no definido? ¿O los operadores OR AND bit a bit son diferentes?

versión del compilador:

gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

Pero creo que la versión del compilador no debería ser motivo para un comportamiento no uniforme. Si^ no compilado entonces| y& tampoco. de lo contrario debería funcionar para todos

No es un error con este compilador en modo c99:gcc x.c -Wall -std=c99.

Respuestas a la pregunta(5)

Su respuesta a la pregunta