¿Las cadenas literales y los valores de retorno de la función son lvalues o rvalues?


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

  2. ¿Es el valor devuelto de una función un lvalue o rvalue?

¿Cómo se nota la diferencia?

3 answers

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

El estándar C reconoce los términos originales para left y right como en L = R; sin embargo, dice pensar en lvalue como locator value, lo que significa aproximadamente que puede obtener la dirección de un objeto y, por lo tanto, ese objeto tiene una ubicación. (Véase 6.3.2.1 en C99 .)

Por el del mismo modo, el estándar ha abandonado el término rvalue, y solo usa "el valor de una expresión", que es prácticamente todo, incluyendo literales como ints, chars, floats, etc. Además, cualquier cosa que pueda hacer con un rvalue también se puede hacer con un lvalue, por lo que puede pensar en todos los lvalues como rvalues.

 40
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-10 20:27:23

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 rvalue 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 asignación. Los literales numéricos son rvalues y por lo tanto no se pueden asignar y no pueden aparecer en el lado izquierdo. Lo siguiente es una declaración válida: int g = 20; Pero lo siguiente no es una declaración válida y generaría un error en tiempo de compilación: 10=20;

 4
Author: rishirocks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 13:23:13

Hay una definición para C++ de Microsoft. Por esta definición, una cadena literal, decir "hola mundo", es lvalue, porque es const y no temporal. En realidad, persiste durante toda la vida útil de su aplicación.

 1
Author: t.g.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-25 05:44:07