La base de las notas de cepillado del lenguaje C no se sacude firmemente <1>

  Página de inicio personal: Bienvenidos todos --> Populus euphratica bajo el desierto

 Chicos, son tan hermosos

 Si encuentra útil el artículo

 Puedes apoyar a los bloggers con un clic

 Cada gramo de su preocupación es la fuerza que me impulsa a perseverar.

 

 ☄: El enfoque de este problema: algunas preguntas de pincel de lenguaje C son propensas a errores

  Espero que todos tengan un feliz estudio y trabajo todos los días. 

1. Sobre las variables globales

2. Acerca de scanf

3. Práctica de puntero

 4. La diferencia entre "A" y 'A'

5. Sobre el almacenamiento de datos

6. Acerca de las matrices bidimensionales

7. Precedencia de operadores


1. Sobre las variables globales

¿No puede usar una variable global antes de que se defina?

extern int a;

int main()
{
	printf("a = %d\n", a);
	return 0;
}

int a = 10;

Echemos un vistazo: en primer lugar, la definición de int a está después de la función principal, y puede usarse por declaración.

Esencia: en primer lugar, a las variables globales se les ha asignado espacio de memoria cuando el programa se está ejecutando, por lo que se pueden usar antes de que se definan.

2. Acerca de scanf

Agregue una declaración de entrada adecuada en la línea horizontal e ingrese desde el teclado durante la ejecución del programa: ¿Cómo está? <Entrar>, el resultado final es:  ¿Cómo está?

int main()
{
	char *a = "How are you?", b[20];
    ——————————————————————————————
	printf("%s %s\n", a, b);
	return 0;
}

A:obtiene(b) B:scanf("%s",b)

 El final de gets es una nueva línea ('\n')

 El final de scanf es la tecla de tabulación de retorno de carro de espacio, que es un carácter continuo.

Entonces deberías elegir B:scanf("%s",b)

3. Práctica de puntero

	int a[10] = { 1, 2, 3, 5, 5, 6, 7, 8, 9, 10 };
	int x = 0;
	int *pa = a;

Con la definición anterior, ¿cuál de las siguientes asignaciones no asigna el elemento con el subíndice 3 de la matriz a x?

A:x = pa[3]                             B:x= *(a+3)

C: x =a[3]                                 D:x = *pa+3

Bajo análisis:

R: Correcto, aunque pa es un puntero, se puede acceder a él en forma de matriz.

B: Correcto, a es la dirección del primer elemento, mueva el tamaño de 3 ints sucesivamente, solo acceda al elemento con el subíndice 3 y asigne el valor en la desreferencia

C: Correcto, el valor con el subíndice 3 se asigna a x en forma de matriz.

D: Error, en primer lugar, es directamente desreferenciar a es el primer elemento de la matriz, y luego +3, esto no es correcto.

 4. La diferencia entre "A" y 'A'

Primero, el carácter 'A' es un solo carácter, y "A" son dos caracteres, A y \0, no son lo mismo.

5. Sobre el almacenamiento de datos

Mira directamente el código:

	unsigned short A = 10;
	printf("~A = %u\n", ~A);
	char c = 128;
	printf("c = %d\n", c);

Analicemos A:

Almacenado en el espacio A es 00000000 00001010, y luego la inversión bit a bit de A se convierte en 11111111 11110101

Luego imprima de acuerdo con %u, es decir, de acuerdo con la impresión de enteros sin signo, es 11111111 11111111 11111111 11110101

El resultado de la impresión es 4294967285

Luego analiza c:

c es 128, el espacio de almacenamiento es 10000000, se está imprimiendo %d, por lo que la configuración se actualiza a

11111111 11111111 11111111 10000000, que es complemento,

Convertir a complemento de uno 10000000 000000000 00000000 01111111

El código original es 10000000 000000000 00000000 10000000,

La última impresión es -128

6. Acerca de las matrices bidimensionales

Los siguientes resultados de salida:

	char arr[2][4];
	strcpy(arr[0], "you");
	strcpy(arr[1], "me");
	arr[0][3] = '&';
	printf("%s \n", arr);

Analicemos primero:

Los datos después de la primera copia son,

 Los datos después de la segunda copia son,

 En este momento, si imprimimos directamente con %s, se imprimirá hasta el final de '\0', pero hemos realizado una operación de asignación y hemos reemplazado '\0' en arr[0][3] con ' $ ' , por lo que el resultado es "tú y yo".

7. Precedencia de operadores

¿Es *p++ el puntero de autoincremento p o a lo que apunta el puntero de autoincremento p?

Mira el código:

	int a = 10;
	int *p = NULL;
	int **pp = NULL;
	p = &a;
	pp = &p;
	printf("%d\n", *pp);
	printf("%d\n", *p++);
	printf("%d\n", *pp);

Podemos ejecutarlo directamente y concluir que es la variable puntero p la que se autoincrementa.

 
Hay dos escuelas de interpretación:

1. Interpretado en C y punteros, bajo la misma prioridad, la asociatividad es de derecha a izquierda.

2. En el diagrama de prioridad, postfix ++ tiene mayor prioridad que dereference (*).

¡Discutamos esto en nuestro foro!

Supongo que te gusta

Origin blog.csdn.net/m0_64770095/article/details/124437038
Recomendado
Clasificación