%i of %d om integer in C af te drukken met printf()?

Ik ben net C aan het leren en ik heb een beetje kennis van Objective-C vanwege mijn liefhebberij in iOS-ontwikkeling, maar in Objective-C gebruikte ik NSLog(@"%i", x);om de variabele xnaar de console af te drukken, maar ik heb een paar C-zelfstudies gelezen en ze zeggen dat ik %dmoet gebruiken in plaats van %i.

printf("%d", x);
en printf("%i", x);drukken beide xcorrect af naar de console.

Deze beide lijken me op dezelfde plaats te brengen, dus ik vraag de ervaren ontwikkelaars wat de voorkeur heeft? Is er nog een semantisch correct of is juist?


Antwoord 1, autoriteit 100%

Ze zijn volledig equivalent wanneer ze worden gebruikt met printf(). Persoonlijk geef ik de voorkeur aan %d, het wordt vaker gebruikt (moet ik zeggen “het is de idiomatische conversiespecificatie voor int“?).

(Een verschil tussen %ien %dis dat wanneer gebruikt met scanf(), dan %dverwacht altijd een decimaal geheel getal, terwijl %ide voorvoegsels 0en 0xherkent als octaal en hexadecimaal, maar geen enkele normale programmeur gebruikt scanf()toch, dus dit zou geen probleem moeten zijn.)


Antwoord 2, autoriteit 32%

Ik voeg hier slechts een voorbeeld toe omdat ik denk dat voorbeelden het begrijpelijker maken.

In printf() gedragen ze zich identiek, dus je kunt ofwel %d of %i gebruiken. Maar ze gedragen zich anders in scanf().

Bijvoorbeeld:

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

Uitvoer:

Je kunt de verschillende resultaten zien voor identieke invoer.

num:

We lezen nummet %d, dus als we 010invoeren, negeert het de eerste 0en behandelt het als decimaal 10.

num2:

We lezen num2met %i.

Dat betekent dat decimalen, octalen en hexadecimalen anders worden behandeld.

Als het num2010geeft, ziet het de leidende 0en ontleedt het als octaal.

Als we het afdrukken met %d, wordt het decimale equivalent van octaal 010afgedrukt, wat 8is.


Antwoord 3, autoriteit 5%

den iconversiespecificaties gedragen zich hetzelfde met fprintfmaar gedragen zich anders voor fscanf.

Zoals sommigen in hun antwoord schreven, is de idiomatische manier om een intaf te drukken het gebruik van dconversiespecificatie.

Met betrekking tot ispecificatie en fprintfzegt C99 Rationale dat:

De %i conversiespecificatie is toegevoegd in C89 voor het gemak van de programmeur om te voorzien in
symmetrie met de %i conversiespecificatie van fscanf, ook al heeft het precies dezelfde betekenis
als de %d-conversiespecificatie bij gebruik met fprintf.


Antwoord 4, autoriteit 2%

%d lijkt de norm te zijn voor het afdrukken van gehele getallen, ik heb nooit begrepen waarom, ze gedragen zich identiek.


Antwoord 5, autoriteit 2%

zowel %dals %ikunnen worden gebruikt om een geheel getal af te drukken

%d staat voor “decimaal” en %i voor “geheel getal”. U kunt %x gebruiken om in hexadecimaal af te drukken en %o om in octaal af te drukken.

U kunt% I gebruiken als synoniem voor% D, als u liever “integer” aangeeft in plaats van “decimaal”.

Op invoer, met behulp van ScanF (), kunt u gebruik maken van zowel% I als% D ook. % Ik bedoel het als een geheel getal in elke basis (octaal, hexadecimaal of decimaal, zoals aangegeven door een 0 of 0x-voorvoegsel), terwijl% D betekent het ontleden als een decimaal geheel getal.

Controleer hier voor meer uitleg

Waarom staat% D voor integer?


Antwoord 6

Zoals anderen zeiden, produceren ze identieke output op printf, maar gedragen zich anders op scanf. Ik geef de voorkeur aan %dover %iom deze reden. Een nummer dat is afgedrukt met %dkan worden gelezen met %den u krijgt hetzelfde nummer. Dat is niet altijd waar met %i, als u ooit ervoor kiest om nul-opvulling te gebruiken. Omdat het gebruikelijk is om het printf-formaatsnaren in scanf-formaatsnaren te kopiëren, zou ik vermijden %i, omdat het u een verrassende bug introductie kan geven:

Ik schrijf fprintf("%i ...", ...);

U kopieert en schrijf fscanf(%i ...", ...);

Ik besluit dat ik kolommen mooi wil uitlijnen en alfabetisatie hetzelfde gedraagt ​​hetzelfde als sorteren: fprintf("%03i ...", ...);(of %04d)

Nu, wanneer u mijn cijfers leest, wordt alles tussen 10 en 99 geïnterpreteerd in octaal. Oeps.

Als u decimale opmaak wilt, zeg dit gewoon.

Other episodes