Diferencias entre comillas simples y comillas dobles en C

4 minutos de lectura

avatar de usuario
salajadin

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

printf('numero');

advertencia: carácter constante demasiado largo para su tipo [enabled by default]
advertencia: pasar el argumento 1 de ‘printf’ hace que el puntero sea un número entero sin conversión. /usr/include/stdio.h:362:12: nota: esperado ‘const char * restringir‘ 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 ""?

avatar de usuario
Iharob Al Asimi

En c el delimitador de cadena es "la ' se utiliza para constantes de caracteres.

las comillas dobles " generará una cadena, una secuencia de bytes con una terminación '\0' byte.

Ejemplo:

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

Él ' generará un número entero, en el caso de un solo carácter, es el valor ASCII que representa, en el caso de varios caracteres, se define la implementación.

Ejemplo:

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

Las cadenas de varios caracteres también generarán un número entero, pero su valor cambia según la implementación/compilador de c.

avatar de usuario
Vlad de Moscú

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

Para definir un carácter literal, debe usar comillas simples. Por ejemplo

'A' es un personaje lietral. En C tiene tipo int e incluso llamado como constante de carácter 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 un literal de cadena, debe usar comillas dobles. Por ejemplo
"A" es un literal de cadena. 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 las expresiones, las matrices de caracteres se convierten en punteros a sus primeros elementos. Por lo tanto, en una cadena de expresión, el literal se convierte en tipo char *. Puedes imaginarlo como

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

El primer parámetro de la función. printf tiene tipo const char *. Por lo tanto, un literal de cadena usado 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. Usarlo como argumento puede resultar en un comportamiento indefinido porque su valor será interpretado por la función printf como una dirección de una cadena. Así que esta declaración

printf( 'A' );

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

avatar de usuario
trucos

Cª, '' se utiliza para constantes de caracteres y "" para cadena, a diferencia de python, donde ambos se pueden usar indistintamente.

  • No solo Python, muchos otros lenguajes de alto nivel tienen este error … lo siento, quiero decir, característica. La única razón que conozco para justificar esto es que no necesitas escapar de uno de los tipos de cotización si lo envuelves con el otro, ¿es esa una buena razón?

    – Iharob Al Asimi

    27 de junio de 2015 a las 12:37

  • @iharob; Sí, esa podría ser una razón.

    – trucos

    27 de junio de 2015 a las 12:39

  • @iharob Creo que la razón es que estos idiomas no tienen un tipo para caracteres individuales, solo cadenas. Entonces, ¿por qué no hacer uso de las comillas simples también?

    – YuHao

    27 de junio de 2015 a las 12:44

  • @YuHao; Esa también es una razón válida.

    – trucos

    27 de junio de 2015 a las 12:49

  • @IharobAlAsimi pero las cadenas en javascript ya no son un lenguaje regular gracias a la interpolación de cadenas y demás. 😀

    – Antti Haapala — Слава Україні

    23 de mayo de 2019 a las 5:15

'' se utiliza para denotar caracteres mientras "" se utiliza para denotar cadenas.

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

FYI, agregando más de un carácter en '' (me gusta 'numero') creará un literal de varios caracteres cuyo valor está definido por la implementación.

avatar de usuario
Shri

Cª, ' se utiliza para constantes de carácter, donde como " se usa para una cadena

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

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

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad