web-dev-qa-db-fra.com

% i ou% d pour imprimer un entier en c en utilisant printf ()?

Je viens d'apprendre le langage C et je connais un peu Objective-C en raison d'une manipulation dans le développement iOS. Cependant, en Objective-C, j'utilisais NSLog(@"%i", x); pour imprimer la variable x sur la console, cependant, je lis quelques tutoriels en C et ils me disent d’utiliser %d au lieu de %i.

printf("%d", x); et printf("%i", x); impriment tous les deux x sur la console.

Ces deux semblent me mettre au même endroit alors je demande aux développeurs expérimentés qui est préféré? Est-ce qu'il y en a un de plus sémantiquement correct ou est à droite?

44
Dummy Code

Ils sont complètement équivalents lorsqu'ils sont utilisés avec printf(). Personnellement, je préfère %d, Il est utilisé plus souvent (devrais-je dire "c'est le spécificateur de conversion idiomatique pour int"?).

(Une différence entre %i Et %d Est que lorsqu'il est utilisé avec scanf(), alors %d Attend toujours un entier décimal, alors que %i reconnaît les préfixes 0 et 0x comme octal et hexadécimal, mais aucun programmeur sensé n'utilise scanf() de toute façon, donc cela ne devrait pas être un problème.)

50
user529758

J'ajoute simplement un exemple ici, car je pense que les exemples facilitent la compréhension.

Dans printf (), ils se comportent de manière identique, vous pouvez donc utiliser% d ou% i. Mais ils se comportent différemment dans scanf ().

Par exemple:

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;
}

Sortie:

enter image description here

Vous pouvez voir les différents résultats pour des entrées identiques.

num:

Nous lisons num en utilisant %d alors quand nous entrons 010 _ il ignore le premier 0 et le traite en décimal 10.

num2:

Nous lisons num2 en utilisant %i.

Cela signifie qu'il traitera les décimales, les octales et les hexadécimaux différemment.

Quand ça donne num2010 il voit le principal 0 et le transforme en octal.

Quand nous l’imprimons avec %d _ il affiche l’équivalent décimal d’octal 010 lequel est 8.

18
A.s. Bhullar

d et i les spécificateurs de conversion se comportent de la même manière que fprintf mais se comportent différemment pour fscanf.

Comme d'autres l'ont écrit dans leur réponse, le moyen idiomatique d'imprimer un int consiste à utiliser le spécificateur de conversion d.

En ce qui concerne i spécificateur et fprintf, la logique C99 dit que:

Le spécificateur de conversion% i a été ajouté dans C89 pour aider le programmeur à fournir une symétrie avec le spécificateur de conversion% i de fscanf, même s’il a exactement la même signification que le spécificateur de conversion% d lorsqu’il est utilisé avec fprintf.

3
ouah

tous les deux %d et %i peut être utilisé pour imprimer un entier

% d signifie "décimal" et% i, "entier". Vous pouvez utiliser% x pour imprimer en hexadécimal et% o pour imprimer en octal.

Vous pouvez utiliser% i comme synonyme de% d, si vous préférez indiquer "entier" au lieu de "décimal".

Lors de la saisie, en utilisant scanf (), vous pouvez également utiliser% i et% d. % i signifie l’analyser sous forme d’entier dans n’importe quelle base (octal, hexadécimal ou décimal, comme indiqué par un préfixe 0 ou 0x), tandis que% d signifie l’analyser sous forme d’entier décimal.

vérifier ici pour plus d'explications

pourquoi% d représente-t-il Integer?

1
Priyatham51

% d semble être la norme pour imprimer des nombres entiers, je n'ai jamais compris pourquoi, ils se comportent de manière identique.

1
Stephan

Comme d'autres l'ont dit, ils produisent une sortie identique sur printf, mais se comportent différemment sous scanf. Je préférerais %d À %i Pour cette raison. Un numéro imprimé avec %d Peut être lu avec %d Et vous obtiendrez le même numéro. Ce n'est pas toujours vrai avec %i, Si jamais vous choisissez d'utiliser zéro padding. Comme il est courant de copier des chaînes au format printf dans des chaînes au format scanf, j’éviterais %i, Car cela pourrait vous donner une introduction de bogue surprenante:

J'écris fprintf("%i ...", ...);

Vous copiez et écrivez fscanf(%i ...", ...);

Je décide de mieux aligner les colonnes et de faire en sorte que l'alphabétisation se comporte comme le tri: fprintf("%03i ...", ...); (ou %04d)

Maintenant, quand vous lisez mes chiffres, tout ce qui se situe entre 10 et 99 est interprété en octal. Oops.

Si vous voulez une mise en forme décimale, dites-le simplement.

0
David Roundy