2010-01-10 14 views
29
  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?¿Las cadenas literales y los valores de retorno de función son lvalues ​​o rvalues?

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

¿Cómo ve la diferencia?

+1

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

+11

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

+0

@Gaim: lvalue y rvalue son el nivel de especificación de compilador y lenguaje. En este caso, se refieren a la sintaxis de C. – Pod

Respuesta

40
  1. literales de cadena son lvalues, pero no se les puede cambiar
  2. rvalue, pero si se trata de un puntero y no es NULL, el objeto al que apunta es un valor-

El estándar C reconoce que los términos originales eran y derechos como en L = R; sin embargo, dice pensar en lvalue como locator value, 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.)

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, incluyendo literales como ints, chars, flotantes, etc. Además, cualquier cosa que pueda hacer con un valor r se puede hacer con un lvalue también, por lo que puede pensar en todos los valores l como valores r.

+2

+1 para respuestas cortas y correctas. 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 para C++. Otro que he cruzado algún día es que los designadores de función son valores en C, mientras que son valores en C++. Por lo tanto, 'op &' in C se puede aplicar a algunos valores r, los que designan funciones. –

+1

Utiliza rvalue en el índice. : P –

+0

@Roger: ¡Gracias! Me pregunto acerca de otros literales que no sean cadenas literales. @Johannes: Acabo de ver que los desinators de funciones son lvalues ​​en línea ayer, y recordé que era para C.¿Me equivoco? – Tim

1

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

4

Hay dos tipos de expresiones en C: 1. lvalue: una expresión que es un lvalue puede aparecer como el lado izquierdo o el derecho de una tarea. 2. rvalue: una expresión que es un valor r puede aparecer a la derecha pero no a la izquierda de una tarea. 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. A continuación se muestra 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;

+1

Nice explicó. – Shinchan

Cuestiones relacionadas