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 TyT constson idénticos. Con los tipos de puntero se vuelve más complicado:const char*es un puntero a una constantecharchar const*es un puntero a una constantecharchar* constes un puntero constante a a (mutable)charEn otras palabras, (1) y (2) son idénticos. La única forma de hacer el puntero (en lugar del puntero)
constes usar un sufijo-const.Esta es la razón por la que muchas personas prefieren colocar siempre
consten 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 intes idéntico aint const, como es cierto con todos los tipos escalares en C. En general, declarar un parámetro de función escalar comoconstno 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
consten 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
thispuntero en la función deFoo * constaFoo const * const. Mira aquí.fuente
Si, son iguales por solo
inty diferente para
int*fuente
Creo que en este caso son iguales, pero aquí hay un ejemplo donde el orden importa:
fuente