Tiendo a usar las palabras definir, declarar y asignar indistintamente, pero esto parece ofender a algunas personas. ¿Está esto justificado? ¿Debo usar solo la palabra declarar por primera vez que asigno a una variable? ¿O hay más que eso?¿Qué son exactamente las definiciones, declaraciones y asignaciones de C++?
Respuesta
Definir y declarar son similares pero asignar es muy diferente.
Aquí estoy declarando (o definir) una variable:
int x;
Aquí voy a asignar un valor a esa variable:
x = 0;
Aquí estoy haciendo ambos en un comunicado:
int x = 0;
Nota
No todos los idiomas admiten declaración y asignación en una declaración:
T-SQL
declare x int;
set x = 0;
Algunos idiomas requieren que se asigna un valor a una variable cuando se declara. Este requisito permite que el compilador o intérprete de la lengua para inferir un tipo de la variable:
Python
x = 0
Me partiré un pelo - Python no tiene ninguna "declaración" de ningún tipo. Las clases y funciones están "definidas", las variables se crean cuando se asignan. En realidad, no "declaras" variables, ya que solo son nombres asignados a objetos. –
Ese es un buen punto: de un pedante a otro aprecio la distinción :) –
Más nítidas: Python no hace ninguna inferencia de ningún tipo, sino que está tipeada dinámicamente. La inferencia de tipo solo es necesaria cuando la variable tiene un tipo.Esto es válido para Python e ilustra los efectos de mi punto: 'x = 5; x = "str" ' –
Estos términos a menudo tienen significados precisos en los estándares para varios lenguajes. Cuando ese es el caso, no deben combinarse.
En c por ejemplo:
una función puede ser define sólo una vez (cuando se dice lo que hace), pero también puede ser declarada antes de eso (cuando se dice qué argumentos toma y qué tipo devuelve).
Del mismo modo, una variable es declarada cuando dices de qué tipo es, y esto ocurre solo una vez para cada ámbito. Pero puede asignar un valor en varias ocasiones. (Algunos idiomas también diferencian entre inicialización (dando una variable un valor en el momento de la declaración) y asignación (cambiando el valor más adelante).)
Es importante utilizar la terminología correcta, de lo contrario la gente se no sabe de lo que está hablando, o asume incorrectamente que no sabe de lo que está hablando.
Una definición es cuando se describe un valor o función, es decir, al compilador o programador se le dice exactamente de qué se trata, p. Ej.
int foo()
{
return 1;
}
int var; // or, e.g. int var = 5; but this is clearer.
Una declaración le dice al compilador o programador que existe la función o variable. p.ej.
int foo();
extern int var;
Una asignación es cuando una variable tiene su valor establecido, generalmente con el operador =. p.ej.
a = b;
a = foo();
+1 eso es básicamente lo que iba a escribir ... –
En realidad, consideraría "int var;" ser definición, "int var = 5;" es un def/ass combinado. Básicamente, en C, la definición es cualquier cosa que crea espacio para un objeto. Voy a votar de todos modos, quizás cambies la respuesta, tal vez no, pero es lo mejor para salir. – paxdiablo
Gracias por la sugerencia, actualicé la respuesta en consecuencia. – jheriko
Las diferencias pueden parecer sutiles, pero son importantes. No todos los idiomas hace que las mismas distinciones, pero en C++ a declaración de variables hace que el tipo y el nombre de la variable conocida por el compilador
int i;
Un almacenamiento definición de la variable asigna y especifica un valor inicial de la variable .
i = 1;
Puede combinar una declaración y definición de variable en una sola declaración, como se hace habitualmente.
int x = 1;
Declarar una variable dentro de una función también reservará memoria para la variable, por lo que el siguiente código define implícitamente la variable a
como parte de su declaración.
int main()
{
int a;
return 0;
}
Como la variable a
se define automáticamente por el compilador, contendrá cualquier valor que se encontraba en la posición de memoria que se ha asignado para ello. Es por eso que no es seguro usar variables automáticas hasta que haya asignado explícitamente un valor conocido.
Una asignación se lleva a cabo cada vez que cambia el valor de una variable en su programa.
x = 2;
x++;
x += 4;
Una declaración función, similar a la declaración de variables, hace que la firma de función conocida por el compilador. Esto le permite llamar a una función en su código fuente antes de que se defina sin causar un error de compilación.
int doSomething(float x);
Una definición función especifica el tipo de retorno, nombre, lista de parámetros, y las instrucciones para una función. Los primeros tres de estos elementos deben coincidir con la declaración de la función. Una función solo debe definirse una vez en un programa determinado.
int doSomething(float x)
{
if(x < 0)
{
x = -x;
}
return static_cast<int>(x);
}
puede combinar las decalartion función y definición en una sola, pero hay que hacerlo antes de la función se llama en cualquier parte de su programa.
Pensé que una * declaración variable * asignó espacio de almacenamiento. Solo obtiene basura en ese espacio a menos que también proporcione una inicialización o hasta que asigne un nuevo valor. Solo puedes inicializar una variable mientras la declaras. – Artelius
@Artelius: en la mayoría de los casos, la declaración incluye una definición implícita del compilador, lo que hace que parezca que la declaración asigna espacio de almacenamiento. Hice una adición (afortunadamente) aclaratoria para incluir esto en mi respuesta. Gracias por mencionarlo. –
He votado esta respuesta ya que es correcta ya que lo he aprendido. Si no, realmente me gustaría saber por qué. Las respuestas anteriores tienen declaración y definición al revés. – lakeweb
La respuesta correcta depende del idioma del que se trate. Los lenguajes de computadora a menudo tienen una terminología específica, ya sea por la especificación del idioma o por la comunidad que crece en torno al idioma. COBOL, cuando lo usaba, tenía una terminología muy diferente a la de los lenguajes más comunes (en el sentido de los idiomas más cercanos a la corriente principal del desarrollo del lenguaje, no de los negocios convencionales). Forth desarrolló una terminología extraña.
Si sabes inglés, generalmente puedes hacerte una buena idea de lo que una palabra significa de su significado normal, pero nunca contar demasiado. Lo mismo es cierto con palabras específicas en todos los idiomas o comunidades lingüísticas.
Depende del idioma, como se ha dicho. Creo que realmente depende de si las palabras se usan para cosas como clases. Para la mayoría de los tipos de datos discutidos aquí, la pregunta podría no tener mucha relevancia. En C++ (ver c++ - What is the difference between a definition and a declaration?), una clase o estructura siempre tiene exactamente una definición, pero puede declararse cero o más veces. Una clase no se puede declarar sin una definición. Entonces "declarado" podría ser sinónimo de "usado".
En la mayoría de los idiomas, los tipos simples como los enteros no necesitan definiciones en la forma en que lo hacen las clases.
Definición, declaración y asignación tienen dos casos:
- para variables.
- para funciones.
Para variable:
- Definición:
Para indica al compilador que reservar memoria para la variable.
int x;
- Desaceleración:
Para le dice al compilador que la variable se define en otro lugar.
extern int x;
- Asignación:
Para indica al compilador para poner el valor en la variable.
x = 0;
Para Funciones:
- Definición:
int functionDef(int x){
int x;
...
...
...
return x;
}
- Desaceleración:
Es sólo el prototipo de la función.
int functionDef(int x);
- 1. ¿Por qué son necesarias las declaraciones anticipadas?
- 2. Declaraciones vs definiciones
- 3. Definiciones de programación: ¿Qué es exactamente 'Building'?
- 4. ¿Qué son exactamente las funciones anónimas?
- 5. ¿Qué son declaraciones directas en C++? En
- 6. ¿Qué son exactamente las "tareas" en el RBAC de Yii?
- 7. ¿por qué son malas las asignaciones en condiciones?
- 8. Las declaraciones de interruptor son malas?
- 9. ¿Cuáles son las diferencias entre las definiciones de parámetros como (tipo y nombre) y (tipo * nombre)?
- 10. ¿Cómo se ignoran las declaraciones de estructura y se consideran solo las definiciones en cscope?
- 11. seguimiento de las asignaciones de memoria C++
- 12. ¿Qué son exactamente los "servicios de WPF"?
- 13. ¿Qué son las declaraciones preparadas por el cliente?
- 14. ¿Qué son exactamente las expresiones que producen * efectos secundarios *?
- 15. ¿Cómo se relacionan las definiciones de plantilla con las declaraciones de plantilla?
- 16. ¿Qué son los filtros de intención exactamente?
- 17. ¿Por qué los nombres de argumento de función no son importantes en las declaraciones de C++?
- 18. ¿Qué son exactamente los metadatos en SQLAlchemy?
- 19. Cierres en PHP ... ¿qué son, exactamente, y cuándo necesitarías usarlos?
- 20. ¿Qué son exactamente los tipos integrales?
- 21. ¿Qué son exactamente los recursos no administrados?
- 22. ¿Son estas 2 declaraciones idénticas?
- 23. ¿Las declaraciones condicionales en las vistas son malas noticias?
- 24. ¿Qué son las etiquetas de documentación C#?
- 25. Objective-C frente a las declaraciones #imports
- 26. ¿Son declaraciones singleline if o si las declaraciones sin llaves son una mala práctica?
- 27. PHP: ¿Qué son construcciones idiomáticas y por qué las necesitamos?
- 28. C# - Ubicación del uso de las declaraciones
- 29. ¿Qué son las cookies firmadas y por qué son útiles?
- 30. Django: ¿Para qué sirven exactamente las señales?
Depende del idioma, obviamente. –