Verwendung von "zd" Planer mit `printf()`?
Suche nach Klärung über die Verwendung "zd"
mit printf()
.
Sicherlich die folgende korrekt mit C99 und später.
void print_size(size_t sz) {
printf("%zu\n", sz);
}
Den C-spec scheint ermöglichen printf("%zd\n", sz)
je nachdem, wie es gelesen wird:
7.21.6.1 Die fprintf
Funktion
z
Gibt an, dass eine folgended
,i
,o
,u
,x
, oderX
umwandlungsspezifikator gilt für einesize_t
oder die zugehörigen Ganzzahl-Typ-argument oder eine folgenden
umwandlungsspezifikator gilt für einen Zeiger auf ein signed-integer-Typ entsprechendsize_t
argument. C11dr §7.21.6.1 7
Sollte dieser gelesen werden, als
- "
z
Gibt an, dass eine folgended
... umwandlungsspezifikator gilt für einesize_t
oder die zugehörigen Ganzzahl-Typ-argument ... "(beide Arten) und "z
Gibt an, dass eine folgendeu
... umwandlungsspezifikator gilt für einesize_t
oder die zugehörigen Ganzzahl-Typ-argument ..." (beide Arten)
ODER
- "
z
Gibt an, dass eine folgended
... umwandlungsspezifikator gilt für eine entsprechende unterzeichnete Ganzzahl-argument ..." (signed type) und "z
Gibt an, dass eine folgendeu
... umwandlungsspezifikator gilt für einesize_t
" (unsigned Typ).
Habe ich mit der #2 definition, aber jetzt nicht so sicher.
Was ist richtig, 1, 2, oder etwas anderes?
Wenn #2 ist richtig, was ist ein Beispiel für einen Typ, können
"%zd"
?
InformationsquelleAutor chux | 2015-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
printf
mit einem"%zd"
format erwartet ein argument des unterzeichneten Typ, der entspricht dem unsigned-Typsize_t
.Standard-C nicht, geben Sie einen Namen für diese Art oder ein guter Weg, um zu bestimmen, was es ist. Wenn
size_t
ist ein typedef fürunsigned long
zum Beispiel, dann"%zd"
erwartet ein argument vom Typlong
, aber das ist nicht die portable Annahme.Standard erfordert, dass entsprechende signed-und unsigned-Typen verwenden die gleiche Darstellung für die nicht-negativen Werte, die darstellbar sind in beiden Typen. Eine Fußnote erklärt, dass dies bedeuten, dass Sie sind austauschbar, da die Funktion Argumente. Also diese:
arbeiten sollen, und drucken sollten "42". Es interpretiert den Wert
42
, der unsigned Typsize_t
, als ob es von der entsprechenden signierten geben. Aber es gibt wirklich keinen guten Grund, das zu tun, da"%zu"
ist auch richtig und gut definiert, ohne Rückgriff auf zusätzliche Sprache Regeln. Und"%zu"
Werke für alle Werte des Typssize_t
, einschließlich derjenigen, die außerhalb der Reichweite der entsprechenden signierten geben.Schließlich, POSIX definiert eine Art
ssize_t
im Header<unistd.h>
und<sys/types.h>
. Obwohl POSIX nicht ausdrücklich so sagen, vermutlichssize_t
werden die signierten Typ entsprechendsize_t
.Wenn Sie also schreiben POSIX-spezifischen code,
"%zd"
ist (wahrscheinlich) das richtige format für den Druck die Werte des Typsssize_t
.ja, ich musste. Es nicht erlauben würde, mich zu ersetzen, downvote mit bis zu Stimmen, weil es' sbeen 2 Stunden. Das ist vollkommen schwachsinnig, da kann ich Bearbeiten und ändern. Ich fragte auf meta zu entfernen, die Einschränkung von Menschen, die haben genug rep zu Bearbeiten, aber es hat nicht überall hingehen. Die änderung war das entfernen zusätzliche leere Zeile vor dem link Fußnoten, die nicht dargestellt werden, so dass Sie es nicht sehen können (ich habe ehrlich gesagt versucht, kommen mit einem sinnvollen Bearbeiten, aber die Antwort war auch gut 🙂
OK, kein problem. Es schien seltsam, dass ich konnte nicht sehen, jede änderung in der edit-history.
Ich sehe die diff: imgur.com/a/QEoAS
6.2.6.2p5: "Ein Gültiger (nicht-trap) Objekt-Repräsentation einer Ganzzahl-Typ, wo das sign-bit ist eine null ist eine gültige Objekt-Darstellung des entsprechenden unsigned-Typ, und stellt den gleichen Wert." Ich habe gerade festgestellt, dass nicht, angeben, in die andere Richtung, obwohl es erfordern würde, eine eigentümliche Darstellung mit mehreren Darstellungen für den gleichen Wert ungleich null ist, brechen die Symmetrie.
InformationsquelleAutor Keith Thompson
Nach dem kleinen test habe ich getan, "zd" ist immer wahr ,aber "zu" funktioniert nicht für negative zahlen.
Test-Code:
true ist für eine erwartete (richtige) Antwort)
Danke für den test, aber bestimmten " "zd" ist immer true, " scheitern wird, wenn
uzs
groß ist wieSIZE_MAX
.Die Prüfung ist nicht der richtige Weg, um zu bestimmen, ob die Dinge, die legal in C.
Beachten Sie, dass, wenn gegeben, einen negativen Wert, %u wird immer berichten, etwas anderes (in einem gut definierten Weise)
InformationsquelleAutor