Я ожидал, что в моем следующем коде:
#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 во время компиляции).
В чем причина? Это неуказано или undefined? или побитовые OR AND, разные?
версия компилятора:
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
Но я считаю, что версия компилятора не должна служить причиной неравномерного поведения. Если ^
не скомпилирован, то |
и &
тоже нет. в противном случае это должно работать для всех
Это не ошибка с этим компилятором в режиме c99: gcc x.c -Wall -std=c99
.