Requisito previo: Pre-incremento y post-incremento en C/C++
En C++, el preincremento (o predecremento) se puede usar como valor l , pero el posincremento (o posdecremento) no se puede usar como valor l.
Por ejemplo, el siguiente programa imprime a = 20 (++a se usa como valor l)
El valor l no es más que la ubicación de la memoria, que tiene una dirección.
CPP
// CPP program to illustrate // Pre-increment (or pre-decrement) #include <cstdio> int main() { int a = 10; ++a = 20; // works printf("a = %d", a); printf("\n"); --a = 10; printf("a = %d", a); return 0; }
Producción:
a = 20 a = 10
Complejidad de tiempo: O(1)
El programa anterior funciona, mientras que el siguiente programa falla en la compilación con el error «sin valor l en la asignación» (a ++ se usa como valor l)
CPP
// CPP program to illustrate // Post-increment (or post-decrement) #include <cstdio> int main() { int a = 10; a++ = 20; // error printf("a = %d", a); return 0; }
Error:
prog.cpp: In function 'int main()': prog.cpp:6:5: error: lvalue required as left operand of assignment a++ = 20; // error ^
¿En qué se diferencia ++a de a++ como lvalue?
Es porque ++a devuelve un lvalue , que es básicamente una referencia a la variable a la que podemos asignar más, como una variable ordinaria. También podría asignarse a una referencia de la siguiente manera:
int &ref = ++a; // valid int &ref = a++; // invalid
Mientras que si recuerda cómo funciona a++, no incrementa inmediatamente el valor que contiene. Para mayor claridad, puede pensar que se incrementa en la siguiente declaración. Entonces, lo que básicamente sucede es que a++ devuelve un rvalue , que es básicamente un valor como el valor de una expresión que no está almacenada. Puedes pensar en a++ = 20; de la siguiente manera después de ser procesado:
int a = 10; // On compilation, a++ is replaced by the value of a which is an rvalue: 10 = 20; // Invalid // Value of a is incremented a = a + 1;
Eso debería ayudar a entender por qué a++ = 20; no funcionará Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA