Introducción al lenguaje C
Conocimientos básicos del lenguaje C
1.1 Introducción al lenguaje C
El lenguaje C fue inventado por Dennis Ritchie en los Estados Unidos en 1972 y se utilizó por primera vez en Computadoras equipadas con el sistema operativo UNIX. Implementado en una computadora DEC PDP-11. Evolucionó a partir del primer lenguaje de programación BCPL (Lenguaje de programación combinado básico). En 1970, Ken Thompson de AT&T Bell Labs diseñó un lenguaje más avanzado llamado B basado en el lenguaje BCPL. A través de modificaciones y mejoras continuas, surgió el lenguaje C más avanzado.
El lenguaje C es un lenguaje informático con potentes funciones, amplia aplicación y desarrollo prometedor. Puede utilizarse tanto para el diseño de software del sistema como para el desarrollo de software de aplicación. Muchos programas de sistemas famosos están escritos en lenguaje C. El lenguaje C tiene las siguientes características:
(1) El lenguaje C no solo tiene las características de un lenguaje de bajo nivel para manipular directamente el hardware, sino que también tiene las características de un lenguaje de alto nivel que es similar al lenguaje natural. y la lógica del pensamiento humano. Los programas en lenguaje C son fáciles de escribir, fáciles de verificar en busca de errores y muy prácticos.
(2) El lenguaje C tiene tipos de datos y operadores ricos y una estructura de sintaxis simple.
(3) El lenguaje C es un lenguaje de programación estructurado que proporciona declaraciones completas de control del programa.
(4) El lenguaje C es un lenguaje de programación modular, adecuado para el desarrollo y desarrollo de software a gran escala.
(5) Otra ventaja destacada del lenguaje C es que es adecuado para múltiples sistemas operativos, como DOS y UNIX, y también es adecuado para múltiples modelos de máquinas. Su portabilidad de programas es buena.
1.2 Tipos de datos en lenguaje C
Los datos son el objeto procesado por el programa y el tipo de datos es la representación intrínseca de los datos. Por ejemplo, la edad y las calificaciones de un estudiante tienen las características de valores numéricos generales, que se denominan tipos numéricos en lenguaje C. La edad es un número entero, que se denomina tipo entero, la calificación puede ser un decimal, que se denomina real; tipo. El nombre y el sexo del estudiante son texto, lo que se denomina datos de caracteres en lenguaje C.
El lenguaje C tiene tipos de datos ricos, entre los cuales los tipos de datos básicos son enteros, reales y de caracteres.
1.2.1 Variables
Una variable es una cantidad cuyo valor se puede cambiar durante la ejecución del programa.
1. Reglas de nomenclatura de variables
Al igual que nombrar personas, también existen ciertas reglas para nombrar variables.
(1) Compuesto por letras, números y guiones bajos;
(2) Debe comenzar con una letra o guión bajo
(3) Las letras son mayúsculas y minúsculas; sensible (en el estado predeterminado del sistema);
(4) Los primeros 32 caracteres son válidos (en el estado predeterminado del sistema).
Por ejemplo: a, Book, book, _Make_Cipher son todos nombres de variables legales, y Book y book son nombres de variables diferentes, y 123A, x+y no son nombres de variables.
2. Tipo de datos de variable
Las variables pueden ser cualquier tipo de datos, como variables enteras, variables de caracteres, variables de puntero, etc. Los tipos de datos básicos y sus características en lenguaje C se muestran en la Tabla 1-1.
Tabla 1-1 Tipos de datos básicos del lenguaje C
Nombre del tipo de datos Descripción del tipo de datos Longitud del tipo de datos (bytes) Rango de valores de datos
char Tipo de carácter 1 0~255
int Entero con signo tipo 2 –32 768~32 767
int sin signo Int sin signo tipo 2 0~65 535
corto Entero corto tipo 2 –32 768~32 767
tipo entero largo largo 4 –2 147 483 648~2 147 483 647
tipo entero largo sin signo 4 0~ 4 294 967 295 p>
número real flotante de precisión simple 4 |3.4×10–38|~|3.4×1038|
número real de doble precisión doble 8 |1.7×10–308|~| 10308|
largo doble largo doble número real 10 |3.4×10–4932|~|3.4×104932|
3. Definición de variables
Cada variable primero debe definir su tipo de datos antes de su uso. El formato de sintaxis para definir los tipos de datos variables es el siguiente:
Símbolo de tipo de datos nombre de variable 1, nombre de variable 2. ,…;
Por ejemplo:
int age,score;/* Definir edad y puntuación como entero*/
char name[20]; Defina el nombre como una matriz de caracteres que contenga como máximo 20 caracteres*/
4. Tipo de almacenamiento de variables
Cuando se define una variable, el sistema de compilación en lenguaje C asignará varias unidades de almacenamiento a la variable para almacenar el valor de la variable. En las computadoras, tanto los registros como la memoria pueden almacenar datos, y la memoria se puede dividir en ocupación temporal y ocupación a largo plazo. El tipo de almacenamiento de una variable se refiere a dónde y cuándo se almacena la variable en la computadora.
El formato de sintaxis para definir tipos de almacenamiento de variables es el siguiente:
Identificador de tipo de almacenamiento identificador de tipo de datos nombre de variable 1, nombre de variable 2,…;
Almacenamiento tipo de variable Hay tipo automático (automático), tipo de registro (registro), tipo estático (estático) y tipo externo (externo). Las características específicas y los métodos de uso se presentarán en detalle en los siguientes capítulos.
Al definir una variable, si no se especifica el tipo de almacenamiento, el sistema utiliza de forma predeterminada auto.
5. Inicialización de variables
La inicialización de variables es un método para asignar valores iniciales a las variables. Significa asignar valores iniciales a las variables cuando están definidas. El método de inicialización de variables es muy simple. En la declaración de definición de variables, simplemente agregue un signo igual y un valor inicial después del nombre de la variable.
Por ejemplo:
int x, edad=20, puntuación=100;
En la definición anterior, a la variable x no se le asigna un valor inicial, pero la variable edad Los valores iniciales de puntuación y puntuación son 20 y 100 respectivamente.
En el programa no se permite el uso de variables antes de que se les asigne un valor, es decir, se debe seguir la regla de "asignar primero y luego usar".
1.2.2 Constantes
Las constantes son datos cuyos valores no cambian mientras el programa está en ejecución. Por ejemplo, pi 3.1415926 es una constante. Las constantes también tienen tipos de datos, que son constantes enteras, constantes reales, constantes de caracteres, constantes de cadena y constantes simbólicas. La longitud de los datos y el rango de valores de las constantes enteras y reales son los mismos que los de las variables.
1. Constantes enteras
Las constantes enteras se utilizan para representar números enteros. Los datos enteros se pueden representar en diferentes sistemas numéricos. Los diferentes sistemas de transporte tienen diferentes métodos de representación, como se muestra en la Tabla 1-2.
Tabla 1-2 Métodos de representación de constantes enteras
Ejemplos de métodos de representación numérica
Cómo escribir números enteros decimales generales 0, –22, 55
Octal suma el número 0 00, –072, +0331 antes del entero octal
Hexadecimal suma el número 0 y la letra x antes del entero hexadecimal 0x0, 0x1B5, –0xb3
Además, para constantes enteras largas, se debe agregar el sufijo L o l después, como 30L. 30L y 30 tienen el mismo valor numérico, pero ocupan diferentes cantidades de memoria. 30 ocupa 2 bytes de espacio de almacenamiento, mientras que 30L ocupa 4 bytes de espacio de almacenamiento.
2. Constantes reales
Las constantes reales solo tienen representación decimal y no hay distinción entre precisión simple y precisión doble. Sus métodos de representación incluyen representación de números de punto fijo y representación de números de punto flotante. El método de expresión específico se muestra en la Tabla 1-3.
Tabla 1-3 Cómo escribir constantes reales
Ejemplo de representación de categorías
La parte entera del número de coma fija La parte decimal 0,0, 1,34. , –34.0
p>La mantisa E (o e) del número de coma flotante tiene un exponente de 3.57E10, –5.6e–9
Explicación:
(1) La representación de números de coma flotante es equivalente a la de la notación científica matemática, la fórmula de conversión es la siguiente:
Mantisa E (o e) exponente = mantisa × 10 exponente
(2) La parte exponente de un número de punto flotante solo puede ser un número entero, la mantisa puede ser mayor o igual a 10.
3. Constantes de caracteres
Las constantes de caracteres se representan mediante dos comillas simples que rodean un solo carácter. Por ejemplo: 'A', '*', '!', etc. Se deben tener en cuenta los siguientes puntos al utilizar constantes de caracteres:
(1) Los espacios también son caracteres, representados como 'a'.
(2) Debe haber exactamente un carácter entre las comillas simples y no puede estar en blanco. Por ejemplo, '' es una constante de carácter incorrecta.
Existe una clase especial de constantes de caracteres en el lenguaje C, llamados caracteres de escape. Se utilizan para representar símbolos especiales o códigos de control en el teclado. Los caracteres de escape comunes se muestran en la Tabla 1-4.
Tabla 1-4 Tabla de caracteres de escape de uso común
Significado del carácter de escape Significado del carácter de escape
\n Retorno de carro y avance de línea\a Anillo
p>
\t Carácter de tabulación horizontal\"comilla doble
\v Carácter de tabulación vertical\'comilla simple
\b Barra invertida un espacio a la izquierda\\ barra invertida
\r Carácter de retorno de carro\ddd El carácter correspondiente al número octal 1~3 ddd
\f Carácter de avance de formulario\xhh El carácter correspondiente al número hexadecimal 1~2 hh Caracteres
4. Constantes de cadena
Una cadena es un número de caracteres entre comillas dobles. Por ejemplo, "hola!", "485769", "a".
Una cadena no puede contener ningún carácter, lo que se denomina cadena vacía y se representa mediante "".
El número de caracteres contenidos en la cadena se denomina longitud de la cadena. Por ejemplo, "abc123." Las longitudes de ", "3" y "" son 6, 1 y 0 respectivamente. Al calcular la longitud de la cadena, debe prestar atención a los siguientes puntos:
(1) Para cadenas que contienen caracteres de escape, los caracteres de escape se cuentan como 1 carácter. Por ejemplo, "abc\\12\n" tiene una longitud de 7, no 9; \123\n" tiene una longitud de ambos. es 6.
(2) En una cadena, una barra invertida representa el comienzo de un carácter de escape. Si no hay ningún carácter de escape listado en la Tabla 1-4 después, la barra invertida se ignora y no participa en el cálculo de la longitud. Por ejemplo, "\A" tiene una longitud de 1, pero "\" es ilegal
Constantes simbólicas
. Presentado anteriormente, las constantes son datos específicos, y un símbolo específico también se puede usar para representar una determinada constante en un programa. Este símbolo se llama constante simbólica.
El formato de sintaxis de las constantes simbólicas es el siguiente:
#define nombre de constante simbólica constante
Por ejemplo:
#define PI 3.1415926
Después de la definición anterior, se puede utilizar PI en el programa en lugar de 3.1415926.
El uso de constantes simbólicas en programas tiene dos beneficios: primero, mejora la legibilidad del programa; segundo, proporciona comodidad para modificar el programa. Por ejemplo, cuando no se requiere una precisión demasiado alta, solo necesita modificar la definición de constante simbólica a
#define PI 3.14
sin modificar el pi en todas partes del programa.
1.3 Operadores aritméticos y expresiones aritméticas
Los símbolos utilizados para representar diversas operaciones se denominan operadores. El lenguaje C incluye las siguientes siete categorías de operadores básicos: operadores aritméticos, operadores lógicos, operadores relacionales, operadores de asignación, operadores de coma, operadores condicionales y operadores bit a bit. Esta sección presenta principalmente operadores aritméticos y otros operadores se presentarán en detalle en capítulos posteriores.
1.3.1 Operadores aritméticos
Los operadores aritméticos en lenguaje C son similares a las operaciones aritméticas en matemáticas. Realizan operaciones aritméticas sobre datos. Los operandos, reglas de operación y asociatividad de los operadores aritméticos se muestran en la Tabla 1-5.
Tabla 1-5 Operadores aritméticos
Número de operandos Nombre del operador Reglas de operación Operadores
Asociatividad del tipo de datos
Monocular más + tomas el valor original de tipo entero o real de derecha a izquierda
Negativo – toma el valor negativo
Binocular plus + toma la operación de suma de izquierda a derecha
Resta – operación de resta
Multiplicación* Operación de multiplicación
Operación de división/división
Módulo % División entera y tipo de resto entero
Suma única 1 (prefijo) ++ primero, luego use un número entero, carácter, variable de puntero o elemento de matriz, tipo real de derecha a izquierda
Agregue 1 (sufijo) ++ primero, use Agregar 1 después
Restar 1 (prefijo) – – Primero restar 1, luego usar
Restar 1 (sufijo) – – Usar primero, luego restar 1
En lenguaje C, el número de Los objetos que participan en la operación se denominan "objeto" del operador. Un operador unario significa que solo hay un objeto participando en la operación, como +10, –67, x++. Operador binario significa que hay dos objetos participando en la operación, como 2+3, 7%3.
Cuando el mismo operador aparece continuamente, algunos operadores operan de izquierda a derecha y algunos operadores operan de derecha a izquierda. En lenguaje C, esta característica de los operadores se denomina combinación.
La suma (+), la resta (–) y la multiplicación (*) son lo mismo que las operaciones aritméticas en matemáticas. Por ejemplo: 3,5+4,7 da como resultado 8,2; 3,5 – 4,7 da como resultado –0,8; 3,5*4,7 da como resultado 16,45.
La operación de división (/) no es exactamente igual a la división en matemáticas. Está relacionada con el tipo de datos del objeto que participa en la operación. Cuando los dos objetos que participan en la operación son datos enteros, el resultado de la operación es la parte entera del resultado de la operación matemática. Por ejemplo, el resultado de 7/4 es 1, no 1,75. Si uno de los dos objetos que participan en la operación es de tipo real o ambos son de tipo real, entonces el resultado de la operación es el valor de la operación real. Por ejemplo, el resultado de la operación de 7/5.0 es 1,4.
El operando de la operación modular debe ser un número entero y el resultado es el resto después de la división. Por ejemplo, el resultado de 7%5 es 2.
Los operadores de incremento y decremento son operadores unarios, utilizados para sumar o restar 1 a variables enteras, reales, de caracteres, de puntero o elementos de matriz. El resultado sigue siendo del tipo original.
1.3.2 Funciones matemáticas de uso común
El sistema de lenguaje C proporciona más de 400 funciones estándar (llamadas funciones de biblioteca), que se pueden usar directamente al diseñar programas. Las funciones de la biblioteca incluyen principalmente funciones matemáticas, funciones de procesamiento de caracteres, funciones de conversión de tipos, funciones de administración de archivos y funciones de administración de memoria. Las funciones matemáticas de uso común se presentan a continuación y otros tipos de funciones se presentarán en capítulos posteriores.
1. Nombre de la función: abs
Prototipo: int abs(int i);
Función: Encuentra el valor absoluto de un número entero.
Por ejemplo, supongamos que x=abs(5), y=abs(–5), z=abs(0), luego x=5, y=5, z=0.
2. Nombre de la función: labs
Prototipo: long labs(long n);
Función: Encuentra el valor absoluto de un entero largo.
Por ejemplo, supongamos que x=labs(40000L), y=labs(–5), z=labs(0), luego x=40000, y=5, z=0.
3. Nombre de la función: fabs
Prototipo: double fabs(double x);
Función: Encuentra el valor absoluto de un número real.
Por ejemplo, supongamos que x=fabs(5.3), y=fabs(–5.3), z=fabs(0), luego x=5.3, y=5.3, z=0.
4. Nombre de la función: piso
Prototipo: doble piso(doble x);
Función: Encuentra el número entero más grande no mayor que x, que es equivalente a la función matemática [x].
Por ejemplo, supongamos que x=piso(–5.1), y=piso(5.9), z=piso(5), entonces x= –6, y=5, z=5.
5. Nombre de la función: ceil
Prototipo: double ceil(double x);
Función: Encuentra el número entero más pequeño que no sea menor que x.
Por ejemplo, supongamos que x=ceil(–5.9), y=ceil(5.1), z=ceil(5), entonces x = –5, y=6, z=5
6. Nombre de la función: sqrt
Prototipo: double sqrt(double x);
Función: Encuentra la raíz cuadrada de x.
Por ejemplo, suponiendo x=sqrt(4), y=sqrt(16), entonces x=1.414214, y=4.0
7. Nombre de la función: log10
Prototipo: double log10(double x);
Función: Encuentra el logaritmo común de x.
8. Nombre de la función: log
Prototipo: double log(double x);
Función: Encuentra el logaritmo natural de x.
9. Nombre de la función: exp
Prototipo: double exp(double x);
Función: Encuentra la potencia x de la constante de Euler e.
10. Nombre de la función: pow10
Prototipo: double pow10(int p);
Función: Encuentra la potencia p de 10.
Por ejemplo, supongamos x=pow10(3), y=pow10(0), luego x=1000, y=1
11. Nombre de la función: pow
Prototipo: double pow(double x, double y
Función: Encuentra x elevado a la yésima potencia.
Por ejemplo, supongamos que x=pow(3,2), y=pow(–3,2), luego x=9, y=9
12. Nombre de la función: sin
Prototipo: double sin(double x);
Función: función seno.
13. Nombre de la función: cos
Prototipo: double cos(double x);
Función: función coseno.
14. Nombre de la función: tan
Prototipo: double tan(double x);
Función: función tangente.
1.3.3 Expresión aritmética
La fórmula formada conectando operadores aritméticos y operandos se denomina expresión aritmética.
La precedencia de los operadores aritméticos de mayor a menor se especifica de la siguiente manera:
++ – –
* / %
+ –
Los operadores ubicados en la misma línea tienen la misma precedencia.
1.4 Reglas de conversión de tipos de datos
Al realizar operaciones con datos, se requiere que los tipos de datos de los objetos que participan en la operación sean los mismos (el tipo de resultado de la operación obtenido por la operación también es la misma que el operando). Por lo tanto, a menudo es necesario convertir el tipo de datos de variables o constantes durante las operaciones. Hay dos métodos de conversión: uno es la conversión automática por parte del sistema (también conocida como conversión implícita) y el otro es la conversión forzada en el programa. conocido como conversión explícita).
1.4.1 Reglas de conversión automática
En operaciones mixtas de diferentes tipos de datos, el sistema implementa la conversión automáticamente. Las reglas de conversión son las siguientes:
(1) Si los datos involucrados en la operación son de diferentes tipos, primero deben convertirse al mismo tipo y luego se realiza la operación.
(2) Convierta datos de tipo bajo en datos de tipo alto y realice operaciones. Por ejemplo, cuando opere entre tipo int y tipo largo, primero convierta el tipo int en tipo largo y luego realice la operación.
Los tipos están ordenados en orden ascendente según la cantidad de bytes del espacio que ocupan. El orden es el siguiente:
char, int, long, float, double.
(3) Todas las operaciones de punto flotante se realizan con doble precisión. Incluso las expresiones que solo contienen operaciones de precisión simple de tipo flotante deben convertirse primero a tipo doble y luego realizarse.
(4) Cuando el tipo char y el tipo short participan en operaciones, primero deben convertirse al tipo int.
Por ejemplo, dado:
float PI=3.14;
int s,r=7;
s=r*r *PI;
Debido a que PI es un tipo de precisión simple, s y r son tipos enteros, al ejecutar la instrucción s=r*r*PI, r y PI se convierten en tipos dobles antes del cálculo y la operación. El resultado también es de tipo doble y el resultado de la operación a la derecha es 153,86. Sin embargo, dado que s es un número entero, el resultado de la operación en el lado derecho del número de asignación debe convertirse a un número entero (la parte decimal se descarta). , entonces el valor de s es 153.
1.4.2 Conversión de tipo forzada
La conversión de tipo forzada se implementa mediante una operación de conversión de tipo y su formato de sintaxis es el siguiente:
(especificador de tipo)( Expresión)
Su función es forzar el resultado de la expresión al tipo representado por el especificador de tipo. Por ejemplo: (float) a convierte a a tipo real; (int)(x+y) convierte el resultado de x+y a tipo entero y (int)x+y solo convierte x a tipo entero;
Debe prestar atención a los siguientes problemas al utilizar la conversión de tipo forzada:
(1) Tanto los especificadores de tipo como las expresiones deben estar entre corchetes (una sola variable puede estar sin corchetes), como como (int)(x+y) escrito como (int)x+y simplemente convierte x en tipo int y luego lo agrega a y.
(2) Para una sola variable que se convierte, ya sea conversión forzada o conversión automática, la longitud de los datos de la variable solo se convierte temporalmente para las necesidades de esta operación y no cambiará el tipo declarado. cuando se define la variable.
Por ejemplo, sea:
float f = –5.75;
int x;
x= (int)f;
Conduce f al número entero –5, por lo que x = –5, pero el tipo de f en sí no cambia y su valor permanece –5,75.
1.5 Estructura del programa
1.5.1 Estructura de la función principal
Cada programa fuente en C es una colección de funciones.
Entre ellas, debe y solo puede haber una función principal. Su nombre de función es main y su estructura es la siguiente:
void main(void)
{
.…
}
Entre ellos, void main(void) se llama parte de descripción de la función (también llamada encabezado de función), y
{
…
}
Se llama cuerpo de la función y cada línea de declaración en el cuerpo de la función debe terminar con un punto y coma.
1.5.2 Comando de inclusión de archivos
El sistema de lenguaje C proporciona más de 400 funciones de biblioteca, y estas funciones se dividen en varios grupos según sus funciones, y cada grupo tiene un grupo. nombre . Por ejemplo, el nombre de grupo de un grupo de funciones matemáticas es math. Hay un archivo correspondiente math.h en la carpeta de nivel inferior de la carpeta de instalación del sistema en lenguaje C. Estos archivos con una extensión .h se denominan archivos de encabezado.
include se denomina comando de inclusión de archivos. Cuando un usuario usa una función en la función de biblioteca estándar del sistema en un programa, se debe agregar una declaración de preprocesamiento como #include al programa (generalmente al principio). del programa)
1.5.3 Estructura básica del programa en lenguaje C
Un programa fuente en lenguaje C completo consta de las siguientes cinco partes:
(1) Comando de preprocesamiento <; /p>
(2) Descripción de la variable global;
(3) Descripción del prototipo de función;
(4) Función principal
(5) otras subfunciones.
Un programa fuente simple en lenguaje C solo requiere dos partes (1) y (4). El "comando de preprocesamiento" es generalmente una serie de comandos de inclusión de archivos, es decir, el comando de inclusión.
En cuanto a la estructura del programa, debes prestar atención a los siguientes aspectos:
(1) Puede estar compuesto por varias funciones, de las cuales debe haber una sola función principal. llamado main y no puede haber otras funciones. Cada función realiza una determinada función y se puede pasar información entre funciones a través de parámetros. La función main () se puede ubicar en cualquier lugar del archivo de programa original, pero la ejecución del programa siempre comienza desde la función principal y la ejecución del programa finaliza cuando se ejecuta la función principal.
(2) La estructura de la subfunción es la misma que la función principal, es decir, se divide en dos partes: la parte de descripción de la función y el cuerpo de la función.
(3) Cada declaración en la función debe tener un punto y coma al final como final de la declaración. Sin embargo, algunas líneas de declaración especiales no requieren un punto y coma al final y, a veces, no hay punto y coma.
(4) Cualquier punto de caracteres encerrados entre "/*" y "*/" se denomina "comentario de programa", que se utiliza para explicar el programa y se puede insertar en cualquier parte del programa y puede utilizar líneas de extensión. Los comentarios del programa no afectan los resultados de ejecución del programa.
(5) El formato de escritura de la función es muy flexible. Se pueden escribir varias declaraciones en una línea (debe haber un punto y coma al final de cada declaración) y también se puede escribir una declaración. múltiples líneas. Se pueden insertar espacios o retornos de carro en cualquier parte del programa.
(6) La función principal puede llamar a cualquier subfunción, pero no a sí misma. Cualquier subfunción también puede llamarse entre sí, pero la subfunción no puede llamar a la función principal.
El siguiente es un programa fuente simple en lenguaje C:
Ejemplo 1-1 Encuentre el área de un círculo.
#include
void main(void)
{
float r,s,p=3.14;
r=10.5;
s=r*r*p;
printf("El área del círculo es: %f ",s );
p>
}
El siguiente es un programa fuente en lenguaje C más completo:
Ejemplo 1-2 Un programa en lenguaje C más completo ejemplo.
#include
#include
int y,z;
void abc( int x);
void main(void)
{
int x;
clrscr();
x=10;
y=20;
z=30;
printf("ok1: x=%d y=%d z=%d \n",x,y,z);
abc(x);
printf("ok2: x=%d y=%d z=%d \n",x ,y,z);
getch();
}
void abc(int x)
{
int y;
printf("ok3: x=%d y=%d z=%d \n",x,y,z);
x=100;
y=200;
z=300;
printf("ok4: x=%d y=%d z=%d \n",x, y,z);
}