pro - ¿Dónde se usa la palabra clave C auto?
palabras claves definicion (8)
En mis días de universidad, leí acerca de la palabra clave auto
y, en el transcurso del tiempo, realmente olvidé de qué se trataba. Se define como:
define una variable local como tener una vida local
Nunca encontré que se esté usando en ningún lado, ¿se usa realmente? En caso afirmativo, ¿dónde se usa y en qué casos?
Con el viejo compilador de Aztec C, era posible convertir todas las variables automáticas en variables estáticas (para aumentar la velocidad de direccionamiento) usando un interruptor de línea de comandos.
Pero las variables explícitamente declaradas con auto
se dejaron tal cual en ese caso. (Una visita obligada para funciones recursivas que de otro modo no funcionarían correctamente!)
En C auto
es una palabra clave que indica que una variable es local a un bloque. Dado que es el valor predeterminado para las variables con ámbito de bloque, es innecesario y muy poco utilizado (no creo que lo haya visto usar fuera de ejemplos en textos que discuten la palabra clave). Me interesaría si alguien pudiera señalar un caso en el que se requirió el uso de un auto
para obtener un análisis o comportamiento correcto.
Sin embargo, en el estándar C ++ 11 la palabra clave auto
ha sido ''secuestrada'' para admitir la inferencia de tipo, donde el tipo de una variable puede tomarse del tipo de su inicializador:
auto someVariable = 1.5; // someVariable will have type double
La inferencia de tipo se agrega principalmente para admitir variables de declaración en plantillas o devuelto de funciones de plantilla donde los tipos basados en un parámetro de plantilla (o deducidos por el compilador cuando se crea una instancia de una plantilla) a menudo pueden ser muy dolorosos para declarar manualmente.
La palabra clave auto
es inútil en el lenguaje C. Está ahí porque antes del lenguaje C existía un lenguaje B en el que esa palabra clave era necesaria para declarar variables locales. (B se desarrolló en NB, que se convirtió en C).
Aquí está el manual de referencia para B.
Como puede ver, el manual está plagado de ejemplos en los que se usa el auto
. Esto es así porque no hay palabra clave int
. Se necesita algún tipo de palabra clave para decir "esta es una declaración de una variable", y esa palabra clave también indica si es local o externa ( auto
versus extrn
). Si no usa uno u otro, tiene un error de sintaxis. Es decir, x, y;
no es una declaración en sí misma, sino auto x, y;
es.
Dado que las bases de código escritas en B tuvieron que ser portadas a NB y a C a medida que el lenguaje fue desarrollado, las versiones más nuevas del lenguaje llevaban algo de equipaje para una compatibilidad hacia atrás mejorada que se traducía en menos trabajo. En el caso de auto
, los programadores no tenían que buscar cada aparición de auto
y eliminarlo.
Es obvio por el manual que el ahora obsolescente "implícito int" cruft en C (que es capaz de escribir main() { ... }
sin int
en el frente) también proviene de B. Esa es otra característica de compatibilidad con versiones anteriores para soportar el código B. Las funciones no tienen un tipo de devolución especificado en B porque no hay tipos. Todo es una palabra, como en muchos lenguajes ensambladores.
Observe cómo una función puede simplemente declararse extrn putchar
y luego lo único que lo convierte en una función que usa el identificador: se usa en una expresión de llamada a función como putchar(x)
, y eso es lo que le dice al compilador que trate esa palabra sin letra como un puntero a la función.
La palabra clave auto
es similar a la inclusión de punto y coma en Python, fue requerido por un lenguaje anterior ( B
) pero los desarrolladores se dieron cuenta de que era redundante porque la mayoría de las cosas eran auto
.
Sospecho que se dejó para ayudar con la transición de B a C. En resumen, un uso es para la compatibilidad del lenguaje B.
Por ejemplo, en B y 80 s C:
/* The following function will print a non-negative number, n, to
the base b, where 2<=b<=10. This routine uses the fact that
in the ASCII character set, the digits 0 to 9 have sequential
code values. */
printn(n, b) {
extrn putchar;
auto a;
if (a = n / b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n % b + ''0'');
}
La palabra clave Auto es una clase de almacenamiento (un tipo de técnica que decide la duración de la variable y el lugar de almacenamiento) ejemplo. Tiene un comportamiento según el cual la variable creada por la Ayuda de esa palabra clave tiene una vida útil (vida) que reside solo dentro de las llaves.
{
auto int x=8;
printf("%d",x); // here x is 8
{
auto int x=3;
printf("%d",x); // here x is 3
}
printf("%d",x); // here x is 8
}
Si hubiera leído la lista IAQ (Preguntas poco frecuentes), sabría que el automóvil es útil principalmente para definir o declarar un vehículo:
auto my_car;
Un vehículo que está constantemente estacionado al aire libre:
extern auto my_car;
Para aquellos que carecen de sentido del humor y quieren "solo los hechos Señora": la respuesta corta es que nunca hay ninguna razón para usar el auto
en absoluto. La única vez que se le permite usar auto
es con una variable que ya tiene auto
clase de almacenamiento auto
, por lo que solo está especificando algo que sucedería de todos modos. Intentar utilizar auto
en cualquier variable que ya no tenga la clase de almacenamiento auto
dará como resultado que el compilador rechace su código. Supongo que si desea obtener información técnica, su implementación no tiene que ser un compilador (pero lo es) y teóricamente puede continuar compilando el código después de emitir un diagnóstico (pero no lo hará).
Pequeño apéndice de kaz :
También hay:
static auto my_car;
que requiere un diagnóstico de acuerdo con ISO C. Esto es correcto, porque declara que el automóvil está descompuesto. El diagnóstico es gratuito, pero apagar la luz del tablero le costará ochenta dólares. (Veinte o menos, si compra su propio dongle USB para el diagnóstico a bordo de eBay).
El extern auto my_car
también requiere un diagnóstico, y por esa razón nunca se ejecuta a través del compilador, a excepción del personal de la ciudad encargado de la aplicación de estacionamiento.
Si ves un montón de extern static auto ...
en cualquier base de código, estás en un mal vecindario; busca un mejor trabajo inmediatamente, antes de que todo el lugar se vuelva a Rust.
auto
es bueno para decir que no quieres que se register
. Sin embargo, a menudo es inútil ya que el compilador colocará el register
cuando no se haya utilizado y cree que es óptimo, y rara vez lo pensará tan incorrectamente, sin embargo, a menudo pasará por alto que el register
es óptimo.
auto
es un modificador como static
. Define la clase de almacenamiento de una variable. Sin embargo, dado que el valor predeterminado para las variables locales es auto
, normalmente no es necesario que lo especifique manualmente.
Esta página enumera diferentes clases de almacenamiento en C.