Considerar:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
¿Son estas dos funciones iguales en todos los aspectos o hay alguna diferencia?
Estoy interesado en una respuesta para el lenguaje C, pero si hay algo interesante en el lenguaje C ++, me gustaría saberlo también.
Respuestas:
const T
yT const
son idénticos. Con los tipos de puntero se vuelve más complicado:const char*
es un puntero a una constantechar
char const*
es un puntero a una constantechar
char* const
es un puntero constante a a (mutable)char
En otras palabras, (1) y (2) son idénticos. La única forma de hacer el puntero (en lugar del puntero)
const
es usar un sufijo-const
.Esta es la razón por la que muchas personas prefieren colocar siempre
const
en el lado derecho del tipo (estilo "East const"): hace que su ubicación en relación con el tipo sea consistente y fácil de recordar (también anecdóticamente parece facilitar la enseñanza a los principiantes ).fuente
El truco consiste en leer la declaración al revés (de derecha a izquierda):
Ambos son lo mismo. Por lo tanto:
El truco de leer al revés es especialmente útil cuando se trata de declaraciones más complejas como:
fuente
char const *
, leído de izquierda a derecha es: "puntero, const, char". Es un puntero para const char. Cuando dice "un puntero que es constante", el adjetivo "constante" está en el puntero. Entonces, para ese caso, su lista de adjetivos debería haber sido realmente: "const, pointer, char". Pero tienes razón, hay ambigüedad en este truco. Es realmente un "truco", más que una "regla" definitiva.No hay diferencia. Ambos declaran que "a" es un número entero que no se puede cambiar.
El lugar donde comienzan a aparecer las diferencias es cuando usas punteros.
Ambos:
declare "a" como un puntero a un número entero que no cambia. Se puede asignar "a", pero no "* a".
declara que "a" es un puntero constante a un número entero. Se puede asignar "* a", pero no "a".
declara que "a" es un puntero constante a un entero constante. No se puede asignar "a" ni "* a".
fuente
Prakash tiene razón en que las declaraciones son las mismas, aunque podría ser necesario un poco más de explicación del caso del puntero.
"const int * p" es un puntero a un int que no permite cambiar el int a través de ese puntero. "int * const p" es un puntero a un int que no se puede cambiar para que apunte a otro int.
Consulte https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const .
fuente
const int
es idéntico aint const
, como es cierto con todos los tipos escalares en C. En general, declarar un parámetro de función escalar comoconst
no es necesario, ya que la semántica de llamada por valor de C significa que cualquier cambio en la variable es local a su función envolvente.fuente
Esta no es una respuesta directa, sino un consejo relacionado. Para mantener las cosas en orden, siempre uso la convección "poner
const
en el exterior", donde por "exterior" me refiero al extremo izquierdo o al extremo derecho. De esa manera no hay confusión: la constante se aplica a lo más parecido (ya sea el tipo o el*
). P.ej,fuente
Son iguales, pero en C ++ hay una buena razón para usar siempre const a la derecha. Serás consistente en todas partes porque las funciones miembro const deben declararse de esta manera:
Cambia el
this
puntero en la función deFoo * const
aFoo const * const
. Mira aquí.fuente
Si, son iguales por solo
int
y diferente para
int*
fuente
Creo que en este caso son iguales, pero aquí hay un ejemplo donde el orden importa:
fuente