Выражения "j = ++ (i | i); и j = ++ (i & i); должны быть ошибкой lvalue?

Я ожидал, что в моем следующем коде:

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

выраженияj = ++(i | i); а такжеj = ++(i & i); выдаст ошибки lvalue, как показано ниже:

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

Но я удивился, что приведенный выше код успешно скомпилирован, как показано ниже:

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

Проверьтевышеуказанный код работает правильно.

Пока другие операторы выдают ошибку (как я понимаю). Даже побитовый оператор XOR вызывает ошибкуj = ++(i ^ i); (отметьте другоеоператоры выдают ошибку lvalue во время компиляции).

Какова причина? Это не указано или не определено? или побитовые операторы ИЛИ И разные?

версия компилятора:

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

Но я считаю, что версия компилятора не должна вызывать неодинаковое поведение. Если^ не компилируется тогда| а также& тоже нет. в противном случае должно работать для всех

Это не ошибка с этим компилятором в режиме c99:gcc x.c -Wall -std=c99.

Ответы на вопрос(5)

Ваш ответ на вопрос