tutorialspoint tag jtls example elseif else c pointers ansi-c

c - tag - jstl if else tutorialspoint



Diferencia entre char*var; y char*var;? (1)

No hay diferencia en este caso. Sin embargo, deberías preferir char *var; .

Esto se debe a que el * está asociado más estrechamente con el nombre de la variable y no es parte del tipo base . Por ejemplo, si haces esto:

char* a, b;

Lo que tienes es a , a point-to- char , b , a char . ¡Esto es confuso! Dado que el carácter * está más cerca de la palabra clave char , esperamos que los tipos de ambas variables sean punteros a caracteres, pero el * realidad está asociado solo con a . (Esto es similar a char a[10], b; como lo señala teppic en los comentarios; el especificador [10] también está asociado con a , y por lo tanto solo a será una matriz).

La declaración correcta sería:

char *a, *b;

Poner el especificador * más cerca de la variable significa que es fácil ver lo que está sucediendo cuando pretende que una variable sea un puntero y la otra no:

char *a, b;

En este caso, es obvio que b no estaba destinado a ser un puntero. En el ejemplo original ( char* a, b; ), no sabemos si el programador pretende que b sea ​​un puntero. Para pedir prestado a Douglas Crockford, todo lo que sabemos es que el programador es incompetente.

A algunas personas les gusta poner un espacio antes y después del * :

char * a, * b;

Esto se ve afectado por el mismo problema ilustrado anteriormente: si b no es un puntero, la declaración ( char * a, b; ) también puede generar incertidumbre sobre la intención del programador. Por lo tanto, sugiero no colocar un espacio entre el * y el nombre de la variable 1 .

De cualquier manera que lo mires, char* var; Debe ser tratado como mal estilo. Es gramaticalmente correcto de acuerdo con la especificación del lenguaje, pero conduce a un código ilegible porque parece indicar que el especificador * es parte del tipo compartido por todas las variables en la misma declaración, cuando no lo es. (Es similar a escribir una función compleja en la misma línea; funciona, pero es una mala idea. Hay casos en los que la legibilidad y la capacidad de mantenimiento sustituyen a las preferencias estilísticas personales, y este es uno de ellos).

1 Personalmente, prefiero poner un espacio después del * solo cuando se trata de valores de retorno de función:

char * foo();

Esto no es ambiguo: es una función que devuelve un puntero a char .

char *foo();

¿Se refería el programador a una función que devuelve un puntero a char , o quería crear un puntero a una función que devuelve char ? El lenguaje resolverá esto como idéntico al otro prototipo, pero nuestro objetivo es la legibilidad, y eso significa transmitir exactamente lo que queremos decir a los humanos , no solo al compilador.

Solo me pregunto si hay alguna diferencia entre:

char* var; char *var;

¿O es solo una cuestión de preferencia (espacio)?