Quiero preguntar sobre el proceso detallado de llamada a funciones en lenguaje C, cómo se pasa la función, cómo se produce la llamada, preferiblemente un video.
Al aprender el lenguaje C, siempre debemos recordar que "el amanecer está por delante" y "mirar hacia atrás vale mil dólares. Esta es una forma importante de adquirir conocimientos, es decir, aprender lo siguiente". conocimientos, no olvide regresar y descubrir las preguntas que quedaron atrás y profundizar su comprensión del conocimiento previo. Esto es lo más difícil de hacer para nuestros estudiantes, pero es lo más importante. Aprender el lenguaje C significa pasar por varias iteraciones y acumular el conocimiento de C que debes dominar.
Entonces, ¿cómo aprendemos bien a programar en C?
1. Conozca bien los operadores y las secuencias de operación del lenguaje C.
Esta es la base para aprender bien a programar en C. Las operaciones del lenguaje C son muy flexibles, ricas en funciones y tienen muchos más tipos de operaciones que otros lenguajes de programación. En comparación con otros lenguajes de programación, las expresiones son más concisas, como la autosuma, la autoresta, la operación de coma, la operación de tres ojos, etc., lo que simplifica las expresiones. Sin embargo, los principiantes suelen encontrar esta expresión difícil de entender. La razón principal es que no comprenden completamente los operadores y las secuencias de operación. Cuando varias operaciones diferentes forman una expresión de operación, es decir, cuando hay varios operadores en una expresión, el orden de precedencia y las reglas de combinación de las operaciones son muy importantes. En el aprendizaje no es difícil recordar estas operaciones siempre que las clasifiquemos razonablemente y averigüemos las diferencias entre ellas y las operaciones aprendidas en matemáticas. Después de comprender algunos operadores, los recordará mentalmente y los podrá utilizar fácilmente en el futuro. Algunos operadores pueden abandonarse temporalmente y recordarse cuando los utilice más adelante.
En primer lugar, hay que tener claro que los operadores se clasifican según diferentes prioridades. Los operadores en programación C se pueden dividir en 15 prioridades, de mayor a menor, la prioridad es 1 ~ 15. Excepto el segundo nivel, los niveles 13 y 14 se combinan de izquierda a derecha para determinar los operadores del mismo nivel.
2. Aprenda bien las cuatro estructuras de programas del lenguaje C
(1) Estructura de secuencia
La programación de la estructura de secuencia es la más simple, siempre que sepa siga la resolución del problema Escriba las declaraciones correspondientes en el orden y su orden de ejecución es de arriba hacia abajo.
Por ejemplo; A = 3, b = 5, ahora intercambiando los valores de A y b, este problema es como intercambiar dos vasos de agua, claro que se necesita una tercera taza. Si la tercera copa es C, entonces el programa correcto es: C = a; a = b = c; Si se cambia el orden, se escribe como: a = b;; c = a; b = c; entonces el resultado de la ejecución se convierte en a = b = c = 5, lo que es más probable que no logre el propósito esperado. tales errores. Las estructuras de secuencia se pueden utilizar de forma independiente para formar un programa simple pero completo. Un programa común para la trilogía de entrada, cálculo y salida es la estructura de secuencia. Por ejemplo, la secuencia de instrucciones del programa consiste en ingresar el radio r del círculo, calcular s = 3,14159*r*r y generar el área s del círculo. Pero en la mayoría de los casos, la estructura de secuencia es parte del programa, junto con otras estructuras, forma un programa complejo, como declaraciones compuestas en estructuras de rama y cuerpos de bucle en estructuras de bucle.
(2) Estructura de ramas
Aunque los programas con estructuras de secuencia pueden resolver problemas de cálculo y salida, no se pueden juzgar antes de la selección. Para cuestiones que requieren juicio antes de la selección, utilice una estructura de ramificación. La ejecución de la estructura de rama selecciona la ruta de ejecución de acuerdo con ciertas condiciones, en lugar de seguir estrictamente el orden físico en que aparecen las declaraciones. La clave del método de programación de estructura de bifurcación es construir condiciones de bifurcación apropiadas, analizar el flujo del programa y seleccionar declaraciones de bifurcación apropiadas de acuerdo con los diferentes flujos del programa. La estructura de rama es adecuada para cálculos de juicios condicionales como comparaciones lógicas o relacionales. Al diseñar un programa de este tipo, a menudo es necesario dibujar primero su diagrama de flujo del programa y luego escribir el programa fuente de acuerdo con el flujo del programa para separar el análisis del diseño del programa del lenguaje para que el problema sea simple y fácil de entender. Un diagrama de flujo de un programa es un diagrama de flujo de ejecución de un programa elaborado en base al análisis de resolución de problemas.
No se deje confundir por el anidamiento de ramas cuando aprenda las estructuras de las ramas, siempre que el diagrama de flujo esté dibujado correctamente y las funciones que debe realizar cada rama sean claras, la estructura anidada no es difícil. El anidamiento es solo una rama que contiene una declaración de rama y no es un conocimiento nuevo. Siempre que comprenda claramente las ramas duales, el anidamiento de ramas no es difícil. Permítanme presentarles algunas estructuras básicas de sucursales.
①If (condición)
La rama en esta estructura de rama puede ser una declaración, en cuyo caso se puede omitir "", o pueden ser varias declaraciones, es decir, un compuesto declaración . Tiene dos caminos bifurcados para elegir. Una es ejecutar la rama cuando la condición es verdadera; de lo contrario, omita la rama y no la ejecute. Por ejemplo, al calcular el valor absoluto de x, de acuerdo con la definición de valor absoluto, sabemos que cuando x> = 0, su valor absoluto permanece sin cambios, y Otros
Esta es una estructura de rama típica. Si la condición es verdadera, ejecute la rama 1, de lo contrario ejecute la rama 2, la rama 1 y la rama 2. La rama 2 puede estar compuesta por 1 o varias declaraciones. Por ejemplo, encuentre la raíz de ax ^ 2+bx+c = 0.
Análisis: Porque cuando B 2-4ac >;=0, la ecuación tiene dos raíces reales, en caso contrario (b 2-4ac
d = b* b-4* a* c;
if(d>=0)
{ x 1 =(-b+sqrt(d))/2a;
x2 =(- b-sqrt(d))/2a;
printf("x1=%8.4f, x2=%8.4f\n ", x1, x2);
} p>
Otro
{ r =-b/(2 * a);
I = sqrt(-d)/(2 * a);
printf(" x 1 = % 8.4f+% 8.4 fi \ n " r, I
printf("x2=%8.4f-%8.4fi\n"r, I)
}
③Declaración de rama anidada: el formato de la declaración es:
If (condición 1);
Else if (Condición 2)
Si no (Condición 3)
……
Si no (Condición n)
Otros
Anidados Las declaraciones de rama pueden resolver el problema de múltiples entradas y salidas, pero después de tres o más anidamientos, la estructura de la oración se vuelve muy complicada, lo cual es extremadamente inconveniente para la lectura y comprensión del programa. Se recomienda anidar dentro de triples. use la siguiente declaración más allá de triple.
④ declaración de cambio: esta declaración también es una declaración de selección de múltiples ramas. El bloque que se ejecuta depende de la configuración del interruptor, es decir, la ruta donde el valor de la expresión coincide con la constante. A diferencia de la sentencia if...else, todas sus ramas son paralelas. Cuando se ejecuta el programa, la primera rama comienza a buscar, y si coincide, se ejecutan los bloques siguientes, y luego los bloques de la segunda rama y. la tercera rama se ejecuta hasta. Si no coincide, averigüe si la siguiente rama coincide. Al aplicar esta declaración, preste especial atención a la configuración razonable de la condición de cambio y la aplicación razonable de la declaración de interrupción. >
(3) Estructura periódica. p>
La estructura de bucle puede reducir la carga de trabajo de la escritura repetida de programas fuente y puede usarse para describir el problema de la ejecución repetida de un determinado algoritmo. Utiliza mejor las fortalezas de la computadora en la programación. El lenguaje C proporciona cuatro bucles, a saber, goto loop, while loop y do? C while y for loop generalmente se pueden usar para resolver el mismo problema, pero generalmente no se recomienda usar goto loop. , Porque cambiar por la fuerza el orden del programa a menudo causará problemas durante la ejecución del programa. En el aprendizaje, aprendemos principalmente while, do... while y for. encontrar sus similitudes y diferencias para que puedan usarse en diferentes situaciones. Esto requiere una comprensión clara del formato y la secuencia de ejecución de los tres bucles, y una comprensión profunda del diagrama de flujo de cada bucle, lo que le ayudará a comprender cómo reemplazarlos. Por ejemplo, tome el bucle while como ejemplo y reescriba un programa usando declaraciones for para comprender mejor su funcionalidad.
Preste especial atención a las declaraciones en el cuerpo del bucle que tienden a terminar (es decir, cambios en los valores de las variables del bucle); de lo contrario, puede convertirse en un bucle infinito, lo cual es un error común entre los principiantes.
Después de aprender estos tres bucles, es necesario aclarar sus similitudes y diferencias: cuando se utilizan los bucles while y do... while, la operación de inicialización de las variables del bucle debe realizarse antes del cuerpo del bucle, mientras que for El bucle generalmente se realiza en la instrucción 1; Los bucles while y for juzgan primero las expresiones y luego ejecutan el cuerpo del bucle, mientras que los bucles while juzgan las expresiones primero, lo que significa que el cuerpo del bucle de do... while se ejecuta en al menos una vez, mientras que los bucles while y for no pueden ejecutarse una vez. Además, cabe señalar que los tres tipos de bucles pueden utilizar la instrucción break para salir del bucle y la instrucción continue para finalizar el bucle. Sin embargo, el bucle formado por la instrucción goto y if no puede ser controlado por break. y continuar declaraciones.
La estructura de secuencia, la estructura de rama y la estructura de bucle no están aisladas entre sí. Puede haber ramas y estructuras de secuencia en bucles, y bucles y estructuras de secuencia en ramas. De hecho, independientemente de la construcción, podemos considerarlas declaraciones en un sentido amplio. En el proceso de programación real, estas tres estructuras a menudo se combinan entre sí para implementar varios algoritmos y diseñar los programas correspondientes. Pero la programación es un gran problema. Los programas escritos suelen ser muy largos y repetitivos, lo que resulta en mala legibilidad y dificultad de comprensión. La forma de resolver este problema es diseñar el programa C en una estructura modular.
(4) Estructura modular del programa
La estructura modular del programa del lenguaje C se realiza a través de funciones, es decir, el programa C complejo se divide en varios módulos y cada módulo está escrito. como una función C, y luego escriba un programa C para un problema grande llamando funciones desde la función principal y llamando funciones desde la función, por lo que a menudo se dice que programa C = función principal + subfunción. Por lo tanto, se debe prestar especial atención a la comprensión y aplicación de las definiciones de funciones, llamadas y valores de retorno, y se deben consolidar mediante la depuración informática.
3. Domina algunos algoritmos simples.
De hecho, una gran parte del trabajo de programación consiste en analizar problemas, encontrar soluciones a los problemas y luego escribir código en el lenguaje de programación correspondiente. Esto requiere dominar los algoritmos. Según nuestro programa de programación en C, sólo necesitas dominar algunos algoritmos simples. Después de dominar estos algoritmos básicos, es fácil completar el análisis del problema. Por ejemplo, el intercambio de dos números, la comparación de tres números, la clasificación por selección y la clasificación por burbujas requieren que aclaremos el significado intrínseco de estos algoritmos.
Conclusión: Cuando comprendemos los aspectos anteriores, siempre que los estudiantes puedan superar su miedo a las dificultades y su disgusto por aprender, escuchar atentamente en clase y hacer ejercicios y depurar en la computadora, el lenguaje C no es difícil. para aprender.
La palabra clave c del programa fuente -.
Las llamadas palabras clave son palabras que se han utilizado en el propio lenguaje C y no se pueden utilizar para otros fines. Por ejemplo, las palabras clave no se pueden utilizar como nombres de variables, nombres de funciones, etc.
El estándar ANSI define 32 palabras clave en lenguaje C * * *:
Interrupción automática de estructura double int else long switch
registro de enumeración de casos typedef char extern Devuelve la unión
const float short unsigned continue para void firmado
El tamaño predeterminado de la variable estática do if
Las palabras clave se pueden dividir en Hay dos categorías: tipo de datos palabras clave y palabras clave de control de procesos.
1 palabra clave de tipo de datos
Tipo de datos básico (5)
Nulo: declara que la función no tiene valor de retorno ni parámetros, no declara ningún puntero de tipo, explícito Descartar el resultado de la operación.
Char: dato de tipo carácter, que es un dato entero.
Int: datos enteros, generalmente la longitud de la palabra de la máquina especificada por el compilador.
Float: datos de punto flotante de precisión simple, que es un tipo de datos de punto flotante.
Doble: datos de punto flotante de doble precisión, que es un tipo de datos de punto flotante.
Palabra clave modificadora de tipo B (4)
Corto: int modificado, datos enteros cortos, se puede omitir el int modificado.
Largo: int modificado, datos enteros largos, se puede omitir el int modificado.
Firmado: datos enteros modificados, tipo de datos firmados.
Sin firmar: datos enteros modificados, tipo de datos sin signo.
c Palabra clave de tipo complejo (5)
Estructura: declaración de estructura
Unión: * *Declarada en aspectos.
Enumeración: Declaración de enumeración
Typedef: Declaración de alias de tipo
Sizeof: Obtiene el tamaño de un tipo específico o variable de un tipo específico.
palabra clave de nivel de almacenamiento d (6)
Auto: designada como una variable automática, asignada y liberada automáticamente por el compilador. Generalmente asignado en la pila.
Estática: designada como una variable estática, distribuida en el área de variables estáticas. Al modificar una función, el alcance de la función se especifica dentro del archivo.
Registro: designado como variable de registro. Se recomienda que el compilador almacene variables en registros para su uso o modifique los parámetros de la función. Se recomienda que los compiladores pasen parámetros a través de registros en lugar de la pila.
Extern: especifique la variable correspondiente como una variable externa, lo que significa que la variable o función se define en otro archivo. Cuando se encuentra la variable o función, se solicita al compilador que la busque en otros módulos. definición.
Const: denominadas colectivamente "características cv" con volátil, la variable especificada no puede ser cambiada por el subproceso/proceso actual (pero puede ser cambiada por el sistema u otros subprocesos/procesos).
Volatil: denominada colectivamente "característica cv" con const, el sistema u otros procesos/procesos pueden cambiar el valor de la variable especificada, lo que obliga al compilador a obtener el valor de la variable de la memoria. cada vez.
2 palabras clave de control de procesos
Una estructura de salto (4 bloques)
Retorno: se utiliza en el cuerpo de la función para devolver un valor específico (o valor nulo, es decir. sin valor de retorno).
Continuar: Finaliza el ciclo actual e inicia el siguiente.
Romper: salir del bucle actual o cambiar la estructura
Ir a: declaración de salto incondicional
bEstructura de rama (5)
Si :Declaración condicional
Else: rama negativa de la declaración condicional (usada con if)
Switch: declaración de cambio (declaración de múltiples ramas)
caso: declaración de cambio Marca de rama en
Predeterminado: dividir y concurvar "Otro" en la instrucción de cambio, opcional.
Estructura de bucle (3)
Para: Para la estructura de bucle, el orden de ejecución de for(1;2;3)4 es 1->2->;4->; ; 3->2... bucle, donde 2 es la condición del bucle.
Hacer: hacer una estructura de bucle, hacer 1 while(2); el orden de ejecución es 1-->2->1... bucle, 2 es la condición del bucle.
Mientras: estructura del bucle while, el orden de ejecución de while(1)2; es 1-->2->1... bucle, 1 es la condición del bucle.
En la declaración de bucle anterior, si la expresión condicional del bucle es verdadera, el bucle continúa; si es falsa, el bucle se salta.
[Editar este párrafo] Nuevos estándares
Tras la estandarización ANSI, el estándar del lenguaje C se mantuvo sin cambios durante un período de tiempo considerable, aunque C++ está mejorando constantemente. (De hecho, la enmienda normal 1 desarrolló una nueva versión en lenguaje C en 1995. Pero esta versión rara vez se conoce). El estándar se mejoró en la década de 1990 y es ISO 9899: 1999 (publicado en 1999). Esta versión suele denominarse C99. Fue adoptado por ANSI en marzo de 2000.
Las funciones incluidas en C99 son:
Se agregaron restricciones en el compilador, como requerir que cada línea del programa fuente admita al menos 4095 bytes y que los nombres de variables y funciones admite 63 bytes (requiere soporte externo 31).
Se ha mejorado el preprocesamiento.
Por ejemplo:
Las macros admiten parámetros #define macro(...)__Virginia ARGS__
Cuando se utiliza una macro, si no escribe parámetros, # y # # en la macro will se expandirá en una cadena vacía. (Incorrecto antes)
Compatibilidad con //comentarios de línea (esta característica en realidad es compatible con muchos compiladores C89)
Se agregaron nuevas palabras clave restrict, inline, _ complex, _ imaginary, _ bool.
Admite tipos long long, long double_complex y float_complex.
Soporte
Soporta matrices de longitud variable. La longitud de la matriz puede ser variable. Simplemente use int a[*] al declarar el tipo. Pero considerando la eficiencia y la implementación, esto no es un tipo nuevo. Por lo que no se puede utilizar en todos los casos, ni en uniones estructurales. Existen limitaciones para las declaraciones Goto si usa algo como esto.
La declaración de la variable no tiene que colocarse al principio del bloque de declaración. La declaración for recomienda escribir for (int I = 0; I<100;++i). int i se coloca dentro y solo es válido para. (VC no cumple con este estándar, I también es válido fuera de for)
Cuando hay algo similar a una estructura que necesita ser construida temporalmente, puedes usar (type_name), un poco como C++. constructor
Al inicializar una estructura, ahora puedes escribir:
struct jeje[]=;
Estructura jeje = // 3, 4 son asignaciones. do,. d.
En cadenas, \u admite caracteres Unicode.
Soporta descripción de números de punto flotante base 16.
Por lo tanto, la mayoría de las cadenas de formato printf scanf admiten LL/LL (I64 usado en VC6) para corresponder al nuevo tipo long long.
La descripción de datos internos de números de punto flotante admite el nuevo estándar y puede ser especificada por el compilador #pragma.
Además del __ _ _line_ _ _ _file_ _ _ _ existente, __func__ también es compatible para obtener el nombre de la función actual.
El compilador también permite la simplificación de expresiones no constantes.
Se ha modificado la definición de /% para manejar números negativos, como -22/7 =-3 y -22% 7 =-1 en el estándar anterior, ahora se cambia a -22/ 7 = -4 y -22% 7 = 6.
Cancelar la regla según la cual el tipo de retorno predeterminado de las funciones que no son de escritura es int.
Permite escribir la última matriz definida por struct como [] sin especificar su longitud.
const const int I; se tratará como const int I; procesando
Se agregaron y modificaron algunos archivos de encabezado estándar, como
soporte de E/S amplio. caracteres y enteros largos.
En comparación con c89, también hay cambios.
1. Agregar un puntero restringido
En C99, se agregó un modificador de tipo restringido al puntero. Esta era la única forma de acceder inicialmente al objeto señalado por el puntero. solo se puede hacer con la ayuda de restringir la expresión del puntero para acceder al objeto. El puntero de restricción se utiliza principalmente como parámetro de función o variable de memoria asignada por la función malloc(). Restringir los tipos de datos no cambia la semántica del programa.
Si una función define dos parámetros que limitan punteros, el compilador asumirá que apuntan a dos objetos diferentes. La función memcpy() es un ejemplo de aplicación típica de limitación de punteros. El prototipo de la función memcpy() en C89 es el siguiente:
Código: void * memcpy (void * s1, constvoid * S2, size_t size);
Si s1 y s2 apunta a que los objetos se superponen, su funcionamiento no está definido. La función Memcpy() solo se puede utilizar con objetos que no se superpongan.
El prototipo de la función memcpy() en C99 es el siguiente: Código: void * memcpy (void * restricts 1, constvoid * RestrictS2, size_t size);
Al modificar los parámetros s1 y s2 con restrict, puede asegurarse de que apunten a diferentes objetos en el prototipo.
2. Palabras clave en línea
Además de mantener definiciones de funciones estructuradas, las funciones en línea también permiten a los programadores escribir código eficiente. Cada llamada y retorno de una función consume considerables recursos del sistema, especialmente cuando la llamada a la función ocurre en una declaración de bucle que se repite muchas veces. Generalmente, cuando ocurre una llamada a una función, es necesario apilar las variables independientes y guardar varias memorias de registros. Cuando la función regresa, es necesario restaurar el contenido de los registros. Si la función se expande en línea en el código, estas operaciones de guardar y restaurar se repetirán cuando se ejecute el código y la velocidad de ejecución de la llamada a la función se acelerará enormemente. La expansión en línea de funciones puede producir código muy largo, por lo que solo se deben incluir funciones que tengan un impacto significativo en el rendimiento de la aplicación y funciones que sean cortas.
3. Agregue un nuevo tipo de datos
_Bool
El valor es 0 o 1. En el lenguaje C99, las carpetas de encabezado se utilizan para definir macros bool, true y false para que los programadores puedan escribir aplicaciones que sean compatibles tanto con C como con C++. Al escribir nuevas aplicaciones, debe utilizar las macros Bool en los archivos de encabezado
& ltstdbool.h & gt.
_Números complejos y _números imaginarios
Los tipos de números complejos definidos en el estándar C99 son los siguientes: float _ Complexfloat _ Imaginary double_complex; double_imaginary;
& ltcomplex.h & gtLas macros complejas e imaginarias se definen en el archivo de encabezado y se expanden a _Complex e _Imaginary, por lo que al escribir nuevas aplicaciones, se deben usar
Long int p>
Long long int (-(2e63-1) a 2e63-1) y unsigned long long int (0-2e64-1) se introdujeron en el estándar C99. Long long int puede admitir una longitud entera de 64 bits.
4. Mejoras a los arrays
Arrays de longitud variable
En C99, cuando el programador declara un array, las dimensiones del array pueden ser cualquier número entero válido. expresiones, incluidas expresiones cuyos valores solo se pueden determinar en tiempo de ejecución. Este tipo de matriz se denomina matriz de longitud variable, pero solo las matrices locales pueden tener longitud variable.
Las dimensiones de una matriz de longitud variable son constantes durante la vida útil de la matriz, es decir, la matriz de longitud variable no es dinámica. Sólo se puede cambiar el tamaño de la matriz. Puede utilizar * para definir una matriz de longitud variable con una longitud variable.