Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

350
Vistas
¿Por qué la variable const no necesita inicializarse en C?

Las variables const en C ++ deben inicializarse, lo que significa que uninitialized const variable inicializada no es posible y es un error del compilador. Pero, ¿por qué no es lo mismo en lenguaje C también? Considere el siguiente programa que compila bien C:

 #include <stdio.h> int main() { const int a; }

¿Cuál es la razón para permitir uninitialized const ? ¿No sería bueno que C también siguiera la misma regla que C++? ¿Se debe a problemas de rendimiento que la variable const local debe inicializarse cada vez que se llama a una función y la inicialización lleva tiempo?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

La diferencia probablemente se deba, entre otras cosas, a un enfoque significativamente más relajado de la inicialización en el lenguaje C en general , no solo con respecto a los objetos const . Por ejemplo, este código es ilegal en C++

 goto over; int a = 5; over:;

porque salta al alcance de a bypass de su inicialización. Mientras tanto, en C, este código es perfectamente legal, con una variable que tiene a valor indeterminado en over: .

La misma lógica se aplica a su const int a declaración. El lenguaje C simplemente cree que un objeto no inicializado no es gran cosa, incluso en situaciones en las que ya no es posible establecerlo en un valor determinado más adelante.

La razón principal de los requisitos de inicialización más estrictos en C++ es la introducción de una inicialización no trivial (constructores) en el lenguaje, es decir, una inicialización que no se puede omitir significativamente. Los objetos escalares y su inicialización en C++ simplemente se etiquetan como una pequeña parte de un concepto mucho más amplio.

¿No sería bueno que C también siguiera la misma regla que C++?

no lo veo C y C++ son lenguajes sustancialmente diferentes. Y también tratan a const de manera bastante diferente.

over 4 years ago · Santiago Trujillo Denunciar

0

Historia.

const se especificó en C++ desde el principio y el uso cumplió con los objetivos de ese lenguaje. const se especificó más tarde en C pero con un significado relacionado pero diferente para minimizar los problemas de compatibilidad del código C existente.

Dado que C comenzó sin const , su inclusión posterior se parece más a un modificador de read-only que a uno constant . Esto permitió a los compiladores existentes tratar esencialmente a const como nada por escribir en un const es un comportamiento indefinido. Los compiladores/códigos más nuevos podrían aprovechar lo que proporciona const .

 const int a; a = 5; // problem in C as code attempts to write `a` // Really should be `const char *fred`, but allowed for backwards compatibility. char *fred = "sally";

C++ tomó un enfoque más fuerte y exige la inicialización.

Ver también const en C vs const en C++

over 4 years ago · Santiago Trujillo Denunciar

0

Porque C tiene absoluta confianza en el programador y le permite hacer muchas cosas, incluidas las estúpidas: int *x = NULL; x[4] = 12; será compilado sin errores e incluso sin advertencias por parte de muchos compiladores.

Más precisamente, const es solo una promesa que hace el programador de que la variable no debe modificarse, y que el compilador podría considerarla como constante si puede ayudar a las optimizaciones. Pero el compilador nunca aplicará ninguna regla de tiempo de ejecución para prohibir cambiar un valor constante:

 const a = 1; int *ix = (int *) &a; *ix = 2; printf("a=%d\n", a); /* UB : could print 1 or 2 */

será compilado sin una advertencia. Pero invocará un comportamiento indefinido porque modificó un objeto declarado como const.

¡Creo que no se permite inicializar variables const simplemente porque la especificación C actual no lo prohíbe! En versiones anteriores, la inicialización siempre ha sido opcional. Tal vez futuras versiones podrían forzar la inicialización de variables automáticas

De todos modos, una variable const global o estática, de hecho, se inicializa automáticamente (según la especificación del lenguaje C 6.7.9 10): si un objeto que tiene una duración de almacenamiento estático o de subprocesos no se inicializa explícitamente, entonces: ... si tiene tipo aritmético, se inicializa a cero (positivo o sin signo); ...

Así static const a; es perfectamente válido como const a si a es global y en ese caso a=0 .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda