¿Son las cadenas literales y los valores de retorno de la función lvalues ​​o rvalues?

  1. Solo me pregunto si una cadena literal es un lvalue o un valor r. ¿Hay otros literales (como int, float, char, etc.) lvalue o rvalue?

  2. ¿El valor de retorno de una función es lvalue o rvalue?

¿Cómo se nota la diferencia?

    1. los literales de cadena son lvalues, pero no puede cambiarlos
    2. rvalue, pero si es un puntero y no NULL, el objeto al que apunta es un lvalue

    El estándar C reconoce los términos originales representados por izquierda y derecha como en L = R ; sin embargo, dice pensar en lvalue como el valor del localizador , lo que significa que puede obtener la dirección de un objeto y, por lo tanto, ese objeto tiene una ubicación. (Ver 6.3.2.1 en C99 )

    Por la misma razón, el estándar ha abandonado el término rvalue, y solo usa “el valor de una expresión”, que es prácticamente todo, incluidos literales como ints, chars, floats, etc. Además, cualquier cosa que se pueda hacer con un valor r también se puede hacer con un lvalue, por lo que puede pensar en todos los valores l como valores r.

    Hay dos tipos de expresiones en C: 1. lvalue: una expresión que es un lvalue puede aparecer como el lado izquierdo o derecho de una asignación. 2. rvalue: una expresión que es un valor r puede aparecer en el lado derecho pero no en el lado izquierdo de una asignación. Las variables son lvalues ​​y, por lo tanto, pueden aparecer en el lado izquierdo de una tarea. Los literales numéricos son valores r, por lo que no se pueden asignar y no pueden aparecer en el lado izquierdo. La siguiente es una statement válida: int g = 20; Pero seguir no es una statement válida y generaría un error en tiempo de comstackción: 10 = 20;

    hay una definición para C ++ de Microsoft. Según esta definición, una cadena literal, por ejemplo “hola mundo”, es lvalue, porque es const y no temporal. En realidad, persiste a lo largo de la vida de su aplicación.