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 %d
moet 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 %i
en %d
is dat wanneer gebruikt met scanf()
, dan %d
verwacht altijd een decimaal geheel getal, terwijl %i
de voorvoegsels 0
en 0x
herkent 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 num
met %d
, dus als we 010
invoeren, negeert het de eerste 0
en behandelt het als decimaal 10
.
num2
:
We lezen num2
met %i
.
Dat betekent dat decimalen, octalen en hexadecimalen anders worden behandeld.
Als het num2
010
geeft, ziet het de leidende 0
en ontleedt het als octaal.
Als we het afdrukken met %d
, wordt het decimale equivalent van octaal 010
afgedrukt, wat 8
is.
Antwoord 3, autoriteit 5%
d
en i
conversiespecificaties gedragen zich hetzelfde met fprintf
maar gedragen zich anders voor fscanf
.
Zoals sommigen in hun antwoord schreven, is de idiomatische manier om een int
af te drukken het gebruik van d
conversiespecificatie.
Met betrekking tot i
specificatie en fprintf
zegt 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 %d
als %i
kunnen 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
Antwoord 6
Zoals anderen zeiden, produceren ze identieke output op printf, maar gedragen zich anders op scanf. Ik geef de voorkeur aan %d
over %i
om deze reden. Een nummer dat is afgedrukt met %d
kan worden gelezen met %d
en 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.