Warum kann bei einem printf () - Aufruf ein Komma fehlen?

7

Ich bin an C # oder Java gewöhnt.

Wie könnte die folgende Aussage in C korrekt sein?

printf("aaa" "bbb");

Auf meinem Xubuntu 15.04 mit GCC 4.9. Es gibt aus:

aaabbb

Und wie ich es versucht habe, funktioniert darunter auch!

%Vor%

Es gibt aus:

%Vor%

Ich denke, es sollte ein Komma sein, aber auf diese Weise wird die erste Zeichenfolge als Formatzeichenfolge behandelt. Also, ist diese Syntax legal?

    
smwikipedia 04.09.2015, 08:48
quelle

5 Antworten

16

Ja, es ist eine legale Syntax wegen Übersetzungsphase 6 in ISO C99, # 5.1.1.2 Übersetzungsphasen:

  
  1. Benachbarte Zeichenfolge-Literaltoken werden verkettet.
  2.   
    
Jens 04.09.2015, 08:54
quelle
6

Wie bereits erwähnt, werden benachbarte Zeichenfolgen vom Compiler verkettet. Aber wenn Sie etwas Unterschied sehen möchten, können Sie einen aaaaaa Null-Terminator in Ihren Strings hinzufügen.

Beim Hinzufügen von aaa wird Ihr o / p nur %code% sein, da printf so lange gedruckt wird, bis der 1. %code% null Terminator gefunden wird.

%Vor%

Ausgabe

%code%

    
Vinay Shukla 04.09.2015 08:56
quelle
5

Die beiden Strings werden nur durch den Compiler verkettet.

    
wap26 04.09.2015 08:51
quelle
2

Wenn der Compiler zwei aufeinanderfolgende Zeichenfolgen Literale sieht, verkettet er sie (zur Zeit des Parsens im Compiler), wie Sie sehen. Dies funktioniert nicht (Compiler-Syntaxfehler) für Nicht-Literale.

Der Kommaoperator steht nicht mit der Verkettung in Verbindung. Sie wertet zuerst den linken und dann den rechten Operanden aus und verwirft das Ergebnis der linken Seite, um das richtige Ergebnis zu erhalten. Es ist nützlich für Nebenwirkungen (wie progn in Lisp, ; in Ocaml, begin in Scheme). Natürlich wird das Komma auch verwendet, um Argumente in Aufrufen zu trennen.

    
Basile Starynkevitch 04.09.2015 08:57
quelle
1

Wie @Jens sagte, werden benachbarte String-Literale vom Compiler verknüpft.

Ein Grund dafür ist, dass Sie Präprozessor-Dinge wie folgt machen können:

%Vor%

Was jedem viel Zeit spart.

    
CoffeeandCode 04.09.2015 09:40
quelle

Tags und Links