Ternärer operator printf innen
Nach der Lektüre diese ich begann zu denken, dass ich gelernt habe, eine Beute zu printf()
. Plötzlich fand ich folgenden code-snippet aus diese Buch:
int main()
{
char str[]="Hello";
int i=5,j=10;
printf(i>j?"%50s":"%s",str); //unable to understand this
return 0;
}
Überraschend obige code läuft ohne Fehler, und es gibt Hallo.
Wie pro meine Kenntnisse nach ist die syntax von printf()
:
int printf(const char *format,argument_list);
Also laut dieser syntax printf()
sollte mit format-string. Aber wie Sie sehen können in obigen code printf()
ist ab i>j
.
Bedeutet es, dass ich falsch Liege in der Interpretation, die syntax von printf()?
Tut Platzierung ternärer operator innerhalb von printf() ist ein Spezialfall?
BEARBEITEN
Ich weiß, über ternäre operator bin ich zu Fragen über erste argument printf()
werden sollte, const char*, das scheine ich nicht in meinem Beispiel.
- Das Ergebnis des Ausdrucks innerhalb der 1. parameter muss ein Zeiger auf ein konstantes char-array, also nichts überraschendes.
- Sie bedeuten, dass etwas auch ohne die doppelten Anführungszeichen ist Zeiger auf Konstanten string
- vielleicht werden die Dinge klarer, wenn Sie schreiben es auf diese Weise:
printf((i>j?"%50s":"%s"), str)
- beide
"%50s"
und"%s"
sind in der Tat Zeiger auf Konstante char-arrays.i>j?"%50s":"%s"
ist ein Ausdruck. Das Ergebnis des Ausdrucks muss ein Zeiger auf ein konstantes char-array. Ich glaube du verwechselst einconst char *
mit einem Konstanten Ausdruck, die nicht die gleiche Sache
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den bedingten operator:
ist ein Ausdruck, und es muss bewertet werden vor dem Aufruf der Funktion selbst ausgewertet werden können. Wir sehen dies im Entwurf der C99-standard Abschnitt
6.5.2.2
Funktionsaufrufe, die sagt:Also, was ist das Ergebnis der Auswertung der bedingte operator? Wenn wir gehen Sie zu Abschnitt
6.5.15
Bedingte operator es sagt (Hervorhebung von mir):also in jedem Fall das Ergebnis ist ein string-literal, das zerfallen wird, um Zeiger auf char erfüllt die Anforderung für das erste argument
printf
.Dieser code ist normal und ist keine spezielle Fall. Die Voraussetzung für
printf
ist, dass das erste argument sollte der Typconst char*
, aber es bedeutet nicht unbedingt, dass es braucht, um ein string-literal wie"%s"
. Das alles bedeutet, dass Sie brauchen, um passieren als erstes argument einen Ausdruck vom Typconst char*
. Undi>j?"%50s":"%s"
erfüllt diese Anforderung.i>j?"%50s":"%s"
ist der Typconst char *
(technisch ist esconst char []
aber es spielt keine Rolle hier) also ich denke, das ist dein Beispiel. Ein weiteres Beispiel wärefunc()
, wofunc
ist eine Funktion der Rückkehrconst char*
.Es ist ein ternärer operator und in diesem der Zustand, den ich>j ist false, so, %s wird als parameter übergeben, um printf, die Sie drucken den Wert des Zeichen-array, die ist Hallo.
Nein, Sie sind nicht interpretieren es falsch.
In C, kann man sagen, dass es ein Ausdruck anstelle einer Anweisung
Dein code ist äquivalent zu:
Ternäre operator ist einfach ein inline -
if
, die als Ausdruck verwendet (während einer regulärenif
wird verwendet, um einen block zu erstellen). Ihre Linie ist gleich diesem:Daher
Hello
gedruckt in beiden SituationenIch denke, dass Sie gut verstanden werden, die
printf
syntax, aber ich denke, Sie sind fehlt etwas über die C-syntax.Es existiert eine form von "compact WENN Sie wie die" Anweisung formatiert, dass : ( Zustand ? wahr : false )
Beispielsweise können Sie tun :
In diesem Fall b=128 und c=9.
Einem anderen Beispiel :
In diesem Fall können Sie sehen : Der Wert true ist
Auf dein Beispiel :
wenn ich oben als j verwenden Sie "%50er Jahre" - format und wenn ich es niedriger ist die Verwendung von "%s" - format
Kann es anzeigen wie :
Können Sie den Vorteil der kompakten test.
Q: bedeutet es, dass ich falsch Liege in der Interpretation, die syntax von printf()?
A: Nein, nur erweitern müssen, was zulässig ist.
Q: ist die Platzierung ternärer operator innerhalb von printf() ist ein Spezialfall?
A: Nein
?:
ist nicht besonderes, aber manchmal auf den ersten Blick verwirrend.Format geliefert
printf()
nicht brauchen, um ein literal. Es kann eine beliebige string-variable.Es ist eine Aussage der form: Bedingung?Folgerung:alternative.
Wird die Bedingung geprüft, und wenn es stimmt bekommst du die konsequenten. andernfalls bekommen Sie die alternative.
Beispiel:
5>3 ist wahr, so erhalten Sie, 10.