Выражения "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
.