¿Las cadenas literales y las funciones devuelven valores lvalues ​​o rvalues?

4 minutos de lectura

avatar de usuario
Tim

  1. Solo pregúntese si una cadena literal es un valor l o un valor r. ¿Son otros literales (como int, float, char, etc.) lvalue o rvalue?

  2. ¿El valor de retorno de una función es un valor l o un valor r?

¿Cómo se nota la diferencia?

  • No estoy seguro de qué quiere decir con “lvalue” y “rvalue”. ¿Quiere decir que este valor puede estar en el lado izquierdo o derecho del operador? En caso afirmativo, debe especificar su pregunta, ya que puede escribir en todas las variables no constantes. el valor de retorno de la función es const.

    – Gaim

    10 de enero de 2010 a las 20:12

  • @Gaim: lvalue y rvalue son términos comunes con significados específicos.

    – jamesdlin

    10 de enero de 2010 a las 20:14

  • @Gaim: lvalue y rvalue son compiladores y lenguaje de nivel de especificación. En este caso se refieren a la sintaxis de C.

    – Vaina

    10 de enero de 2010 a las 20:53

  • Un buen artículo está aquí. eli.thegreenplace.net/2011/12/15/…

    – Resplandor de neón

    15 de febrero de 2013 a las 6:33

  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 que significaban izquierda y Correcto como en L = R; sin embargo, dice pensar en lvalue como valor del localizador, lo que más o menos 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.)

De la misma manera, el estándar ha abandonado el término rvalue y solo usa “el valor de una expresión”, que es prácticamente todo, incluidos los 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.

  • +1 por respuesta corta y correcta. No tenía idea de que el estándar C no usa “rvalue” en ninguna parte, pero en realidad ese es el caso (¡solo hice una búsqueda!). Otra diferencia interesante con C++. Otro que crucé algún día es que los designadores de funciones son valores r en C, mientras que son valores l en C++. Entonces op& en C se puede aplicar a algunos valores r, aquellos que designan funciones.

    – Johannes Schaub – litb

    10 de enero de 2010 a las 20:25

  • Utiliza rvalue en el índice. :PAGS

    Roger Paté

    10 de enero de 2010 a las 20:27

  • @Roger: ¡Gracias! ¿Solo me pregunto acerca de otros literales que no sean literales de cadena? @Johannes: Acabo de ver que los designadores de funciones son valores l en algún lugar en línea ayer, y recordé que era para C. ¿Me equivoco?

    – Tim

    10 de enero de 2010 a las 20:33

  • C99, 6.3.2.1/4: “A designador de función es una expresión que tiene un tipo de función”. Creo que eso está diciendo que son rvalues, ya que no tienen un tipo de objeto. Enlacé a donde puede encontrar el estándar C, si tiene mucha curiosidad, pero no doy ninguna garantía sobre tu cordura después del estándar.

    Roger Paté

    10 de enero de 2010 a las 20:36


  • En particular, los literales compuestos en C99 son lvalues. Así que de hecho puedes hacer int *p = &(int){ 42 }; printf("%d", *p);.

    – Johannes Schaub – litb

    10 de enero de 2010 a las 21:12

Hay dos tipos de expresiones en C: 1. lvalue: una expresión que es un lvalue puede aparecer en el lado izquierdo o derecho de una tarea. 2. rvalue: una expresión que es un rvalue puede aparecer en el lado derecho pero no en el lado izquierdo de una tarea. Las variables son valores l y, por lo tanto, pueden aparecer en el lado izquierdo de una tarea. Los literales numéricos son valores r y, por lo tanto, no se pueden asignar y no pueden aparecer en el lado izquierdo. La 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;

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad