Wyrażenia „j = ++ (i | i); i j = ++ (i & i); powinny być błędem wartości l?

Spodziewałem się tego w moim następującym kodzie:

#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;
}

wyrażeniaj = ++(i | i); ij = ++(i & i); spowoduje błędy lwartości jak poniżej:

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

Ale zdziwiłem się, że powyższy kod skompilował się pomyślnie, jak poniżej:

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

Czekpowyższy kod działa poprawnie.

Podczas gdy inni operatorzy powodują błąd (jak rozumiem). Nawet operator bitowy XOR powoduje błądj = ++(i ^ i); (sprawdź inneoperatory powodują błąd wartości l w czasie kompilacji).

Jaki jest powód? Czy to jest nieokreślone lub niezdefiniowane? lub operatory bitowe OR AND są różne?

wersja kompilatora:

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

Ale wierzę, że wersja kompilatora nie powinna powodować niejednolitego zachowania. Jeśli^ nie skompilowany| i& również nie. w przeciwnym razie powinien działać dla wszystkich

To nie jest błąd tego kompilatora w trybie c99:gcc x.c -Wall -std=c99.

questionAnswers(5)

yourAnswerToTheQuestion