2010-06-01 12 views
23

He estado revisando un poco de C estudiando usando el libro Beginning C de Ivor Horton. Llegué al punto de declarar constantes que parece mezclarse con variables en la misma oración.¿Por qué usar constantes en la programación?

Solo para aclarar, ¿cuál es la diferencia al especificar constantes y variables en C, y realmente, cuando necesitas usar una constante en lugar de una variable? Sé que la gente dice usar una constante cuando la información no cambia durante la ejecución del programa, pero realmente no puedo pensar en un momento en que una variable no pueda ser utilizada en su lugar.

+0

longitud fija guardar s memoria donde peor copia de caso a nueva matriz funciona –

+0

Esta pregunta requiere solo un contra-ejemplo: ¿por qué haría PI una variable? –

+0

@ Hans Passant: ¿Estás seguro de que Pi es una constante? Hasta ahora solo se ha medido en las proximidades de la Tierra. ¿Estás seguro de que es constante en todo el continuo espacio-tiempo? –

Respuesta

29

Una variable, como se puede adivinar por el nombre, varía con el tiempo. Si no varía, no hay "pérdida". Cuando le dices al compilador que el valor no cambiará, el compilador puede hacer un montón de optimizaciones, como enunciar directamente el valor y nunca asignar ningún espacio para la constante en la pila.

Sin embargo, no siempre se puede contar con que el compilador sea lo suficientemente inteligente como para poder determinar correctamente si un valor cambiará una vez configurado. En cualquier situación donde el compilador sea incapaz de determinar esto con 100% de confianza, el compilador se equivocará por el lado de la seguridad y asumirá que podría cambiar. Esto puede dar lugar a diversos impactos en el rendimiento, como evitar la alineación, no optimizar ciertos bucles, crear código de objeto que no sea tan fácil para el paralelismo.

Debido a esto, y dado que la legibilidad también es importante, debe esforzarse por usar una constante explícita siempre que sea posible y deje las variables para las cosas que realmente pueden cambiar.

cuanto a por qué se utilizan las constantes en lugar de números literales:

1) Se hace que el código sea más legible. Todo el mundo sabe lo que 3.14 es (con suerte), no todo el mundo sabe que 3.07 es la tasa de impuesto a la renta en PA. Este es un ejemplo de conocimiento específico de dominio, y no todos los que mantengan su código en el futuro (por ejemplo, un software de impuestos) lo sabrán.

2) Ahorra trabajo cuando realiza un cambio. Ir y cambiar cada 3.07 a 3.18 si la tasa de impuestos cambia en el futuro será molesto. Siempre quiere minimizar los cambios e idealmente hacer un solo cambio. Cuantos más cambios concurrentes deba realizar, mayor será el riesgo de que se olvide de algo, lo que generará errores.

3) Usted evita los errores arriesgados. Imagine que hay dos estados con una tasa de impuesto a la renta de 3.05, y luego uno de ellos cambia a 3.18 mientras que el otro se queda en 3.07. Simplemente yendo y reemplazando, podrías terminar con errores severos. Por supuesto, muchos valores constantes enteros o de cadena son más comunes que "3.07". Por ejemplo, el número 7 podría representar el número de días de la semana y algo más. En programas grandes, es muy difícil determinar qué significa cada valor literal.

4) En el caso de texto de cadena, es común utilizar nombres simbólicos para cadenas para permitir que los grupos de cadenas cambien rápidamente en el caso de admitir varios idiomas.

Tenga en cuenta que, además de las variables y las "variables constantes", también hay algunos idiomas con enumeraciones. Una enumeración realmente le permite definir un tipo para un pequeño grupo de constantes (por ejemplo, valores de retorno), por lo que su uso proporcionará seguridad de tipo.

Por ejemplo, si tengo una enumeración para los días de las semanas y para los meses, se me avisará si asigno un mes en un día. Si solo uso constantes enteras, no habrá ninguna advertencia cuando el día 3 esté asignado al mes 3. Siempre desea seguridad de tipo, y mejora la legibilidad. Las enumeraciones también son mejores para definir el orden. Imagine que tiene constantes para los días de la semana, y ahora quiere que su semana comience el lunes en lugar del domingo.

+3

OP no pregunta por literales. la pregunta era ¿POR QUÉ usar las constantes cuando las cosas no cambian? ... ¿por qué NO usar variables para todo? no es como si nos fuéramos a agotar ... –

+1

Siento que el primer párrafo de mi respuesta responde que: no es necesario usar una variable si no cambia con el tiempo. Pero aclararé esto más. – Uri

+0

También agregaría: 5) Tipo de seguridad. – matias

1

La palabra clave const se usa a menudo para los parámetros de función, particularmente los punteros, para sugerir que la memoria a la que apunta el puntero no será modificada por la función. Mira el decleration para strcpy por ejemplo:

char *strcpy(char *dest, const char *src); 

De lo contrario, por ejemplo, una declaración como

const int my_magic_no = 54321; 

podría ser la preferida sobre: ​​

#define MY_MAGIC_NO 54321 

por razones de seguridad de tipo.

+0

Uhh, acabo de darme cuenta de que realmente no abordo la pregunta de por qué usar constantes sobre las variables. –

+0

No creo que OP no pregunte sobre los parámetros, sino sobre las variables locales ... –

+0

Bueno, gracias Brian por señalarlo. Como si no hubiera notado ya; - | –

9

Por un lado, la optimización del rendimiento.

Más importante aún, esto es para lectores humanos. Recuerde que su público objetivo no es solo el compilador. Ayuda a expresarse en el código y evitar comentarios.

const int spaceTimeDimensions = 4; 

if(gpsSattelitesAvailable >= spaceTimeDimensions) 
    Good(); 
+2

OP no está realmente preguntando sobre constantes contra literales ... pero constantes contra variables ... –

+0

Aún así, es una herramienta de legibilidad. –

1

Constante es cuando solo quiere compartir la memoria, y no cambia.

+3

Cuando quiere compartir la memoria, se deshace la mente. Mi mente a tu mente ... –

+2

¿Una mente derretida? ¿Eso es como cursi y servido con tostadas? –

+0

Entonces, en general, ¿es un aumento de rendimiento en comparación con el uso de variables? –

13

El uso de constantes es más una forma de programación defensiva, para protegerse de sí mismo, de cambiar accidentalmente el valor en algún lugar del código cuando está codificando a las 2 a.m. o antes de haber bebido su café.

Técnicamente, sí, puede usar una variable en su lugar.

+0

2am ¿quieres decir? (relleno) – Ponkadoodle

+3

@wallacoloo: Por supuesto, gracias. Eso es lo que sucede al escribir una respuesta a las 12 a. M.:) –

+3

No se olvide, * sleep * es también una táctica de programación defensiva. – Jackson

1

Es una forma realmente fácil de atrapar cierto tipo de errores. Si declara una variable const y accidentalmente intenta modificarla, el compilador lo llamará.

6

Las constantes tienen varias ventajas sobre las variables.

Las constantes proporcionan cierto nivel de garantía de que el código no puede cambiar el valor subyacente. Esto no es de mucha importancia para un proyecto más pequeño, pero importa en un proyecto más grande con múltiples componentes escritos por múltiples autores.

Las constantes también proporcionan una buena pista al compilador para la optimización. Como el compilador sabe que el valor no puede cambiar, no necesita cargar el valor de la memoria y puede optimizar el código para que funcione solo con el valor exacto de la constante (por ejemplo, el compilador puede usar turnos para la multiplicación/división si la const es una potencia de 2.)

Las constantes también son inherentemente estáticas: puede declarar la constante y su valor en un archivo de encabezado y no tener que preocuparse por definirlo exactamente en un solo lugar.

+2

Tal garantía puede hacer que la depuración y el mantenimiento sean mucho más fáciles; si algo es una variable, a menudo se encontrará buscando cualquier lugar en el código que lo modifique; si es una constante, puedes evitar eso. – caf

2

Para un lenguaje de bajo nivel como C, las constantes permiten varias optimizaciones de compilación.

Para un lenguaje de programación en general, realmente no los necesita. Los lenguajes dinámicos de alto nivel como Ruby y JavaScript no los tienen (o al menos no en un verdadero sentido constante). Las variables se usan en su lugar, tal como sugirió.

0

No usar const puede significar que alguien en un proyecto de equipo podría declarar dónde int FORTY_TWO = 42 y hacerlo igual a FORTY_TWO = 41 en otro lugar por otro miembro del equipo. Por lo tanto, el fin del mundo sucede y también pierdes la respuesta a la vida. con const aunque nada de esto sucederá.Además, const se almacena en otro lugar de la memoria, en comparación con el almacenamiento de variables normales, y es más eficiente.

1

Constantes son muy necesarias en lo que respecta a la declaración de la variable de inicialización y para cualquier propósito, como en el inicio del bucle, para comprobar el estado dentro del estado -else si, etc.

Para mayor referencia, se siente libre de leer cualquiera de los siguientes artículos:

+0

ese sitio es bueno para lo básico ... – yogi

Cuestiones relacionadas