%i o %d para imprimir entero en c usando printf()?


Estoy aprendiendo C y tengo un poco de conocimiento de Objective-C debido a incursionar en el desarrollo de iOS, sin embargo, en Objective-C estaba usando NSLog(@"%i", x); para imprimir la variable x en la consola, sin embargo, he estado leyendo algunos tutoriales de C y están diciendo que use %d en lugar de %i.

printf("%d", x); y printf("%i", x);ambos imprimen x a la consola correctamente.

Ambos parecen llevarme al mismo lugar, así que estoy preguntando a los desarrolladores experimentados cuál es el preferido? Ser uno más semánticamente correcto o es correcto?

Author: Dummy Code, 2013-06-27

6 answers

Son completamente equivalentes cuando se usan con printf(). Personalmente, prefiero %d, se usa más a menudo (¿debería decir "es el especificador de conversión idiomático para int"?).

(Una diferencia entre %i y %d es que cuando se usa con scanf(), entonces %d siempre espera un entero decimal, mientras que %i reconoce los prefijos 0 y 0x como octales y hexadecimales, pero ningún programador cuerdo usa scanf() de todos modos, por lo que esto no debería ser una preocupación.)

 44
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 20:17:58

Solo estoy agregando un ejemplo aquí porque creo que los ejemplos lo hacen más fácil de entender.

En printf() se comportan de manera idéntica para que puedas usar cualquier %d o %i. Pero se comportan de manera diferente en scanf().

Por ejemplo:

int main()
{
    int num,num2;
    scanf("%d%i",&num,&num2);// reading num using %d and num2 using %i

    printf("%d\t%d",num,num2);
    return 0;
}

Salida:

introduzca la descripción de la imagen aquí

Puede ver los diferentes resultados para entradas idénticas.

num:

Estamos leyendo num usando %d así que cuando entramos 010 ignora la primera 0 y lo trata como decimal 10.

num2:

Estamos leyendo num2 usando %i.

Eso significa que tratará decimales, octales y hexadecimales de manera diferente.

Cuando se da num2 010 ve el principio 0 y lo analiza como octal.

Cuando lo imprimimos usando %d imprime el equivalente decimal de octal 010 que es 8.

 15
Author: A.s. Bhullar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-19 05:50:11

d y i los especificadores de conversión se comportan igual con fprintf pero se comportan de manera diferente para fscanf.

Como algunos otros escribieron en su respuesta, la forma idiomática de imprimir un int es usando d especificador de conversión.

Con respecto a i especificador y fprintf, la justificación de C99 dice que:

El especificador de conversión %i se agregó en C89 para la conveniencia del programador para proporcionar simetría con el especificador de conversión %i de fscanf, aunque tenga exactamente el mismo significado como el especificador de conversión % d cuando se usa con fprintf.

 3
Author: ouah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 20:27:03

%d parece ser la norma para imprimir enteros, nunca me di cuenta de por qué, se comportan de manera idéntica.

 1
Author: Stephan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 20:17:41

Tanto %d como %i se pueden usar para imprimir un entero

%d significa "decimal", y %i significa "entero."Puede usar %x para imprimir en hexadecimal y %o para imprimir en octal.

Puede usar %i como sinónimo de %d, si prefiere indicar "entero" en lugar de "decimal."

En la entrada, usando scanf(), puede usar usar %i y %d también. %i significa analizarlo como un entero en cualquier base (octal, hexadecimal o decimal, como se indica con un prefijo 0 o 0x), mientras que %d significa analizar como un entero decimal.

Compruebe aquí para más explicación

¿Por qué %d significa Entero?

 1
Author: Priyatham51,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:02

Como otros dijeron, producen una salida idéntica en printf, pero se comportan de manera diferente en scanf. Preferiría %d sobre %i por esta razón. Un número que se imprime con %d se puede leer con %d y obtendrá el mismo número. Eso no siempre es cierto con %i, si alguna vez elige usar relleno cero. Debido a que es común copiar cadenas de formato printf en cadenas de formato scanf, evitaría %i, ya que podría darle una introducción de error sorprendente:

Escribo fprintf("%i ...", ...);

Copias y escribes fscanf(%i ...", ...);

Decido que quiero alinear las columnas más bien y hacer que la alfabetización se comporte de la misma manera que la ordenación: fprintf("%03i ...", ...); (o %04d)

Ahora, cuando lees mis números, cualquier cosa entre 10 y 99 se interpreta en octal. Oops.

Si quieres formato decimal, solo dilo.

 0
Author: David Roundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-09 12:55:57