2011-12-30 25 views
11

este código:¿Hay alguna diferencia entre int & a y int & a?

int a = 5; 
int& b = a; 
b = 7; 
cout << a; 

imprime 7, y la sustitución de int& b con int &b También imprime 7.

De hecho lo mismo ocurre con int&b y int & b.

He probado este tipo de comportamiento con una clase simple también. En general, ¿alguna vez importa si el signo y se coloca en relación con el tipo y el identificador? Gracias.

+1

no, no hace ninguna diferencia. – Nerdtron

Respuesta

15

No, no hay absolutamente ninguna diferencia excepto el estilo de codificación. Creo que el principal argumento sobre el estilo de codificación es que esta declaración:

int& a, b; 

declara a como int& y b como int.

+0

Gracias, cuidaremos de eso. – newprogrammer

+0

@Ryan Supongo que int & a, b; dará error de compilación como referencia a se declara pero no se inicializa. – Shailesh

+0

@Shailesh: Correcto, sería 'int & a = foo, b = bar'. – Ryan

1

No hace una diferencia en el compilador de qué manera está escrito. Lo correcto es una cuestión de estilo de código.

9

En los idiomas tipo C, el espacio en blanco en su mayoría no importa.

Todas las versiones se enumeran de análisis ya que los mismos tres fichas:

  • int
  • &
  • b

lo que significa lo mismo para el compilador.

La única vez que el espacio en blanco es importante es cuando separa dos tokens alfanuméricos, y aun así la cantidad y el tipo de espacio en blanco no importa, siempre y cuando haya alguno. Pero cualquier tipo de puntuación siempre se convierte en un token separado de los alfanuméricos, no se necesita espacio en blanco.

Así que su código puede llegar a ser tan corto como sea: se necesita

using namespace std;int a=5;int&b=a;b=7;cout<<a; 

El espacio en blanco restante.

+0

Gracias por la aclaración sobre cuándo se necesita espacio en blanco. – newprogrammer

+1

La otra vez que importa son las definiciones de macro. Si no hay espacio entre el nombre de la función y un siguiente paréntesis de apertura, entonces la macro es similar a la función. Si hay, entonces el paréntesis es parte de la lista de reemplazo. –

4

En general, ¿alguna vez importa si se coloca el ampersand en relación con el tipo y el identificador?

El ejemplo publicadas no importa, pero hay casos en los que opera:

int & a, b; // b is not a ref 
int const * a; // pointer to const int 
int * const a; // const pointer to int 

Como siempre, el espacio en blanco, no importa.

1

No hace ninguna diferencia porque c/C++/java estos idiomas no son sensibles al espacio.

1

Estos son dos declaraciones funcionalmente equivalentes:

int& a; // & associated with type 
int &a; // & associated with variable 

asociar el & o * con el nombre del tipo refleja el deseo del programador para tener un tipo de puntero separada. Sin embargo, la dificultad de asociar el & o * con el nombre del tipo en lugar de la variable es que, de acuerdo con la sintaxis formal C++, ni el & ni el * es distributivo en una lista de variables. Por lo tanto, creando fácilmente declaraciones engañosas. Por ejemplo, la siguiente declaración crea una, no dos, referencias enteras.

int& a, b; 

Aquí, b se declara como un número entero (no es una referencia entero) porque, cuando se utiliza en una declaración, la & (o *) está unido a la variable individual que antecede, no al tipo que sigue. El problema con esta declaración es que, visualmente, tanto a como b parecen ser de tipos de referencia, aunque solo a es una referencia, por lo que la confusión visual no solo engaña a los programadores novatos C++, sino también a los programadores ocasionalmente experimentados.

No importa si escribe int &a o int& a para un compilador C++. Sin embargo, para evitar confusiones, & y * deberían asociarse con variables en lugar de escribir.

Cuestiones relacionadas