putchar() vs printf() - gibt es einen Unterschied?
Ich bin derzeit in Kapitel 1.5.1 Datei kopieren und aus einem Programm etwa so:
#include <stdio.h>
/* copy input to output; 1st version */
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
Wenn ich lief es so:
PS <..loc..> cc copy-0.c
PS ./a
Black
Black
White
White
Gray
Gray
Die Ausgabe ist das, was ich Eingangs.
Und hier ist ein Programm, die ich für experimentelle Zwecke:
#include <stdio.h>
/* copy input to output; 1st version */
main()
{
int c;
c = getchar();
while (c != EOF) {
printf("%c",c);
c = getchar();
}
}
Er produziert das gleiche Ergebnis, aber gibt es einen Unterschied zwischen putchar
und printf
?
Was ist besser zwischen den 2?
printf("%c, c);
undputchar(c);
haben identisches Verhalten in diesem Beispiel.printf("%c, c)
undputchar(c)
Funktion nur der Rückgabewert unterscheidet sich - und das ist in diesem Beispiel nicht verwendet.putchar(c)
wird sicherlich schneller alsprintf("%c, c)
. Der Grad der Geschwindigkeit ist stark abhängig von vielen anderen Faktoren.- Warum Würde putchar schnell sein , und warum putchar_unlocked ist schneller?
- Ein optimierender compiler kann emittieren den gleichen code für
printf("%c, c)
undputchar(c)
und so keine performance-Unterschied in diesem Fall. Mit einem weniger intelligenten compilerputchar(c)
mit seiner einfachen Funktionalität wäre sicherlich schneller alsprintf("%c, c)
, obwohl, ohne zu testen, den Grad der speed Unterschied ist unbekannt und kann marginal sein.putchar_unlocked()
ist nicht ein standard-C-library-Funktion - ich bin nicht vertraut mit details.
Du musst angemeldet sein, um einen Kommentar abzugeben.
printf
ist ein allgemeiner Druck-Funktion arbeitet mit 100 verschiedenen Formatbezeichner und druckt das richtige Ergebnis-string.putchar
gut, legt ein Zeichen auf den Bildschirm. Das bedeutet auch, dass es wohl viel schneller.Zurück zu der Frage: verwenden Sie
putchar
drucken ein einzelnes Zeichen. Wieder, es ist wahrscheinlich viel, viel schneller.putchar()
kürzer ist. In helfen können, wenn Sie Golfen.putc
makro enthält code, fügt ein Zeichen in einen stream. Dass Abstraktion ist die Schönheit der *nix (inspiriert) Betriebs-Systeme und Laufzeit-Bibliotheken und der Grund, warum Sie können pipe die Ausgabe eines Programms als Eingabe eines anderen, oder laufen Server ohne physische terminals.Den ich kompiliert habe, ein Beispiel zur Verwendung von printf("a") mit -S-und bekam Aufruf putchar im assembly-code.
Sieht aus wie wenn du nur einen char in der printf-der compiler wandelt es in ein putchar().
Ich habe ein weiteres Beispiel mit printf("ab") und bekam call printf, mit dem text-Abschnitt in der %edi-register.
printf können Sie Formatzeichenfolgen auf eine komplizierte Art, wobei Dinge wie ganze zahlen und Gleitkommazahlen und strings.
getchar und putchar bekommen und setzen Zeichen
Kann ich sagen, dass printf ist mehr nützlich, mehr Möglichkeiten im Vergleich zu putchar.
Besser Aussehen in Ihren jeweiligen manual-pages ( man 3 printf man 3 putchar ) im terminal
Daher, wenn Sie anzeigen möchten, nur ein Zeichen auf dem Bildschirm, die Nutzung putchar.
Zum Lesen einer Zeichenkette wird die Funktion.
Anzeigen Zeichenfolge, die Sie verwenden können, puts() oder printf beide.
Der Unterschied ist, dass
putchar
Drucke ein Zeichen in der Erwägung, dassprintf
drucken können viel mehr.Generell, wenn du etwas drucken das terminal enden soll es mit einem neue-Zeile-Zeichen,
'\n'
. Zumindest aus diesem Grund würde ich vorschlagen, mitprintf
wie können Sie dann schreibenstatt
putchar
Anrufe scheinen besser, und auch nicht allzu ausführlich hier. Einfacher zu Lesen, zu.Das ist eine erstaunliche Frage, obwohl es schon 5 Jahre aus gestellt worden ist.
Derzeit Lerne ich etwas über die multi-Prozess und machen Sie einige übung mit C
und ich fand einen verwirrten problem : wenn Sie mit fork()
der Kind-Prozess erhalten können, was "passiert vor"!
die Ausgabe ist
Komisch? parent-und child-Prozess putchar('a'), die vor dem fork()!
und Sie können sogar Millionen putchar() vor dem fork(), und Sie alle von parent-und child-Prozess.Aber printf hat, nicht betroffen.
Ich versuche es und suchen Sie in stackOverflow und fand diese Fragen
und ich denke, dass es etwas über den buff, wie die putchar() und printf Sie beide einen buff, und drucken Sie die Zeichenfolge einmal trifft es ein \n also in dieser situation, Kind-Prozess kopiert die Eltern-buff, so wird es scheinbar wieder Rollen Sie den code, und führen Sie die vorherigen putchar