Diferencias entre ” y ” C

Recientemente he visto que si uso printf con ‘foo’ recibo una advertencia.

 printf('numero'); 

advertencia: constante de caracteres demasiado larga para su tipo [habilitada de forma predeterminada] advertencia: pasar el argumento 1 de ‘printf’ hace que el puntero sea un entero sin una conversión. /usr/include/stdio.h:362:12: nota: esperado ‘const char * restrict ‘ pero el argumento es de tipo ‘int’ extern int printf (const char * __ restrict __format, …); advertencia: el formato no es una cadena literal y no hay argumentos de formato [-Wformat-security]

Y cuando uso "" no recibo ninguna advertencia printf("numero");

Entonces, ¿cuál es la diferencia entre '' y "" ?

En c , '' se usa para las constantes de caracteres y "" para la cadena, a diferencia de python, donde ambos se pueden usar indistintamente.

En c, el delimitador de cadena es " , el ' se usa para constantes de caracteres.

Las comillas dobles " generarán una cadena, una secuencia de bytes con un byte '\0' termina.

Ejemplo:

 const char *string = "Example"; /* the sequence -> ['E', 'x', 'a', 'm', 'p', 'l', 'e', '\0'] is generated */ 

El ' generará un entero, en el caso de un solo carácter, es el valor ascii que representa, en el caso de múltiples caracteres, su implementación está definida.

Ejemplo:

 char A = 'A'; /* the ascii value of 'A', 0x41 or 65 decimal */ 

Las cadenas de caracteres múltiples, también generarán un entero, pero sus cambios de valor dependen de la implementación / comstackdor de c.

Hay una diferencia entre los literales de caracteres y los literales de cadena.

Para definir un literal de carácter necesitas usar comillas simples. Por ejemplo

'A' es un personaje lietral. En C tiene tipo int e incluso llamada constante de carácter de tipo entero. Su valor es un valor numérico de la representación interna del personaje. También puede usar constantes de caracteres multibyte como por ejemplo ‘AB’ pero su valor está definido por la implementación.

Para definir una cadena literal necesitas usar comillas dobles. Por ejemplo, "A" es una cadena literal. Tiene el tipo de una matriz de caracteres de dos caracteres (incluido el cero final) char[2] . Puedes imaginarlo como

 char s[2] = { 'A', '\0' }; 

En expresiones, las matrices de caracteres se convierten en punteros a sus primeros elementos. Así, en una cadena de expresión, el literal se convierte al tipo char * . Puedes imaginarlo como

 char s[2] = { 'A', '\0' }; char *p = s; 

El primer parámetro de la función printf tiene el tipo const char * . Por lo tanto, un literal de cadena utilizado como argumento puede usarse en la función printf .

Por ejemplo

 printf( "A" ); 

Es lo mismo que

 printf( p ); 

donde p se define como se muestra arriba.

Una constante de carácter entero tiene tipo int . Si se usa como argumento, se puede producir un comportamiento indefinido porque su función será interpretada por la función printf como una dirección de una cadena. Así que esta statement

 printf( 'A' ); 

no es válido. El printf considerará el valor interno de la constante por ejemplo 65 (si consideramos la tabla ASCII) como una dirección de memoria e intentará generar lo que está almacenado en esta dirección.

'' se usa para denotar caracteres mientras que "" se usa para denotar cadenas.

printf espera un const char* (una cadena) como su primer argumento. Necesitas usar "" para eso. Si usa '' , el comstackdor se quejará y le dirá que printf espera un const char* como su primer argumento y no un char .

Para su información, agregar más de un carácter en '' (como 'numero' ) creará un literal de múltiples caracteres cuyo valor se define por implementación.

En c, ' se usa para constantes de caracteres, donde como " se usa para una cadena

La función printf en c necesita una cadena, por lo que su código printf('numero'); resultará un comportamiento inesperado.

En su lugar, utilice printf("numero");

Puedes leer este pequeño tutorial para más ayuda.