Preincremento (o predecremento) con referencia al valor L en C++

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *