Einfache, doppelte Anführungszeichen und sizeof(‘a’) in C/C++

Lesezeit: 2 Minuten

Pratts Benutzeravatar
Pratt

Ich habe mir die Frage Einfache Anführungszeichen vs. doppelte Anführungszeichen in C oder C++ angesehen. Ich konnte die gegebene Erklärung nicht ganz verstehen, also schrieb ich ein Programm:

#include <stdio.h>
int main()
{
  char ch="a";
  printf("sizeof(ch) :%d\n", sizeof(ch));
  printf("sizeof(\'a\') :%d\n", sizeof('a'));
  printf("sizeof(\"a\") :%d\n", sizeof("a"));
  printf("sizeof(char) :%d\n", sizeof(char));
  printf("sizeof(int) :%d\n", sizeof(int));
  return 0;
}

Ich habe sie mit gcc und g++ kompiliert und das sind meine Ausgaben:

gcc:

sizeof(ch)   : 1  
sizeof('a')  : 4  
sizeof("a")  : 2  
sizeof(char) : 1  
sizeof(int)  : 4  

g++:

sizeof(ch)   : 1  
sizeof('a')  : 1  
sizeof("a")  : 2  
sizeof(char) : 1  
sizeof(int)  : 4  

Die Ausgabe von g++ macht für mich Sinn und daran habe ich keinen Zweifel. In gcc, was muss man haben sizeof('a') anders sein als sizeof(char)? Gibt es einen tatsächlichen Grund dafür oder ist es nur historisch?

Auch in C, wenn char und 'a' unterschiedliche Größe haben, bedeutet das, wenn wir schreiben
char ch="a";führen wir eine implizite Typkonvertierung durch?

  • mögliches Duplikat von Zeichengröße (‘a’) in C/C++

    – Bo Persson

    15. Mai 2012 um 20:16 Uhr

  • Ich bin tatsächlich überrascht sizeof("a") : 2 – all die Jahre, und ich bin immer davon ausgegangen, dass das dasselbe wäre wie sizeof(char*) – Ich hätte es vielleicht tatsächlich benutzt, wenn ich es anders gewusst hätte.

    Benutzer180247

    22. Mai 2012 um 19:28 Uhr

In C werden Zeichenkonstanten wie z 'a' Typ haben intin C++ ist es char.

Zur letzten Frage, ja,

char ch="a";

bewirkt eine implizite Konvertierung der int zu char.

  • +1: @Pratt: in der Verwendung von C in den 1970er Jahren, int war der Rückgabetyp für getc(). Es verwendet -1, um EOF anzugeben, was auch eine praktische Konvention für viele andere Dinge war, mit denen häufig gearbeitet wird char Ausdrücke, wie die Indizierung in ein Array für die Verarbeitung von Zeichenumbrüchen, die Transformation von Zeichenketten (wie stricmp()) etc.

    – Wallyk

    15. Mai 2012 um 18:43 Uhr

  • @wallyk: getc() kehrt noch zurück intund es kehrt immer noch zurück EOF um anzuzeigen, dass keine weiteren Zeichen gelesen werden müssen. EOF ist als negativ definiert int Wert; es ist typisch -1.

    – Keith Thompson

    15. Mai 2012 um 18:54 Uhr

  • Und der Grund, warum C++ die Regeln geändert hat, ist, dass Sie Funktionen überladen können.

    – Jess Gut

    15. Mai 2012 um 21:18 Uhr

  • Sehr schönes Thema, Antworten und Kommentare. 🙂

    – Die Maske

    15. Mai 2012 um 23:03 Uhr

  • @KeithThompson der int von zurückgegeben getc und Freunde ist eine andere Art von int aber zu den Zeichenkonstanten! Zeichenkonstanten können negativ sein, aber die getc sind alles nicht negative Werte. Was negative Zeichenwerte wären, wird modulo angepasst UCHAR_MAX+1.

    – MM

    26. September 2016 um 9:09 Uhr

weil es kein Zeichen gibt, nur ganze Zahlen, die mit einem Zeichen verknüpft sind

wie a ist 62, denke ich

wenn Sie es mit printf(“%c”,62) versuchen; Sie werden ein Zeichen sehen

1412500cookie-checkEinfache, doppelte Anführungszeichen und sizeof(‘a’) in C/C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy