char vier [4]="vier"; Was ist die korrekte Semantik für diese Aussage?

7
%Vor%

Wenn es als C ++ - Programm kompiliert wird, meldet G ++

xxx.cpp: In der Funktion int main ():

xxx.cpp: 3: Fehler: Initialisierungszeichenfolge für Array von Zeichen ist zu lang

Beim Übersetzen eines C-Programms meldet GCC keinen Fehler.

Es scheint mir, dass die Zuweisung alle 4 Bytes korrekt in die Variable kopiert, wie ich es erwartet habe.

Also meine Frage läuft auf .....

hinaus

Ist das beobachtete Verhalten in C korrekt oder berühre ich ein undefiniertes Verhalten irgendwo, oder ist es etwas ganz anderes?

    
EvilTeach 19.08.2010, 16:42
quelle

4 Antworten

22

Kurze Antwort: Ihr Code ist gültig C, aber nicht gültig C ++.

Lange Antwort:

"four" ist eigentlich 5 Zeichen lang - da ist ein ’%code%’ für dich hinzugefügt. Im Abschnitt 6.7.8 Initialisierung , Absatz 13, heißt es im C-Standard:

  

Ein Array von Zeichentypen kann durch ein Zeichenkettenliteral initialisiert werden, das optional in geschweifte Klammern eingeschlossen ist. Aufeinander folgende Zeichen des Zeichenkettenliterals (einschließlich des abschließenden Nullzeichens, wenn Platz vorhanden ist oder das Array eine unbekannte Größe hat) initialisieren die Elemente des Arrays.

Also wird das %code% in Ihrem Programm einfach ignoriert, wenn es als C kompiliert wird. C ++ behandelt es anders. Dieser spezielle Fall wird in der C ++ - Spezifikation (Abschnitt 8.5.2 Zeichenarrays , Absatz 2) explizit explizit genannt:

  

Es dürfen nicht mehr Initialisierer vorhanden sein als Array-Elemente. [ Beispiel:

%Vor%      

ist schlecht formatiert, da für das implizite nachgestellte %code% kein Platz ist. - Ende Beispiel ]

    
Carl Norum 19.08.2010, 16:44
quelle
2

Die Zeichenfolge "vier" enthält tatsächlich fünf Bytes: die vier Buchstaben plus ein Nullbyte (\ 0) als Zeichenfolgenabschlusszeichen. Es ist eine Weile her, seit ich C oder C ++ geschrieben habe, aber ich würde annehmen, dass der C-Compiler es aus irgendeinem Grund still ignoriert.

    
fizban 19.08.2010 16:46
quelle
2

Besser wäre

%Vor%     
Jeff Walker 19.08.2010 16:55
quelle
1

Was Sie sehen, ist ein Unterschied zwischen C und C ++. C ermöglicht Ihnen zusätzliche Initializer, die ignoriert werden. C ++ verbietet dies - wenn Sie eine Größe für eine Zeichenkette (oder ein Array) angeben, muss groß genug sein, um alle Initialisierer (einschließlich des NUL-Terminators im Fall einer Zeichenkette) aufzunehmen, oder Code ist schlecht gebildet (Standard für "es ist nicht erlaubt - erwarten, dass der Compiler es ablehnt").

    
Jerry Coffin 19.08.2010 17:04
quelle