Expresiones "j = ++ (i | i); y j = ++ (i & i); ¿debería ser un error de valor l?
Esperaba eso en mi siguiente código:
#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;
}
expresionesj = ++(i | i);
yj = ++(i & i);
producirá errores de valor como a continuación:
x.c: In function ‘main’:
x.c:6: error: lvalue required as increment operand
x.c:9: error: lvalue required as increment operand
Pero me sorprendió que el código anterior se compilara con éxito, de la siguiente manera:
~$ gcc x.c -Wall
~$ ./a.out
11 11
12 12
Comprobarel código anterior funciona correctamente.
Mientras que otros operadores producen error (como yo entiendo). Incluso el operador bit a bit XOR causa un error.j = ++(i ^ i);
(consultar otralos operadores producen un error de valor en tiempo de compilación).
¿Cual es la razon? ¿Esto es no especificado o no definido? ¿O los operadores OR AND bit a bit son diferentes?
versión del compilador:
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)
Pero creo que la versión del compilador no debería ser motivo para un comportamiento no uniforme. Si^
no compilado entonces|
y&
tampoco. de lo contrario debería funcionar para todos
No es un error con este compilador en modo c99:gcc x.c -Wall -std=c99
.