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
.