2010-08-25 13 views
27

que he visto este hecho en C antes:¿Qué significa "12345" + 2 en C?

#define MY_STRING "12345" 
... 
#define SOMETHING (MY_STRING + 2) 

Lo que hace algo obtener expandió a, aquí? ¿Esto es legal? ¿O es que quieren decir esto ?:

#define SOMETHING (MY_STRING[2]) 
+21

¿Qué es lo que no tiene un compilador? – rook

+0

A veces, pedir Stack Overflow es más rápido que intentarlo en un compilador ... – Joe

+7

¿Más rápido? http://codepad.org/VRZvcphU Me tomó todos los 60 segundos ... – bta

Respuesta

81

Existen literales de cadena en el segmento de datos fijo del programa, por lo que aparecen en el compilador como un tipo de puntero.

+-+-+-+-+-+--+ 
|1|2|3|4|5|\0| 
+-+-+-+-+-+--+ 
^ MY_STRING 
    ^MY_STRING + 2 
+37

+1 para arte ASCII. – Skurmedel

+2

¿Se puede hacer esto (usando el signo +) con Unicode también? –

+0

Yo también amo el arte ASCII, así que tengo que votar este como la respuesta. – Joe

20

Cuando se tiene una matriz o puntero, p+x es equivalente a &p[x]. Entonces MY_STRING + 2 es equivalente a &MY_STRING[2]: da la dirección del tercer carácter en la cadena.

Aviso lo que sucede cuando se agrega 0. MY_STRING + 0 es lo mismo que &MY_STRING[0], ambos de los cuales son los mismos que la escritura simplemente MY_STRING ya que una cadena de referencia no es más que un puntero al primer carácter de la cadena. Afortunadamente, entonces, la operación de identidad "agregar 0" no es operativa. Considere esto como una especie de prueba de unidad mental que podemos usar para verificar que nuestra idea sobre lo que + significa es correcta.

+1

Creo que mi cuelgue aquí fue que no sabía que una cadena entrecomillada era igual a la matriz de caracteres, al menos sintaxis. Gracias. +1. – Joe