Frage zu Ausgabe C



  • Hallo zusammen ich bin Relativ neu im Programmieren und habe desshalb zu einem Programm das ich nicht ganz verstehe unten rein geschrieben

    Könnte mir jemand netterweise erklären warum die Ausgabe bei diesem Programm
    ➡ 0
    ➡ N
    ist?

    Danke schon mal im vorhinein 😃

    #include <stdio.h>

    int main(void)
    {
    char zeichen;

    zeichen = '70';

    printf("Zeichen: %c\n", zeichen);

    zeichen = zeichen + 30;

    printf("Zeichen: %c\n", zeichen);

    return 0;
    }



  • Hi,

    du bist zwar im falschen Topic gelandet, dass ist (wie deine Frage bereits sagt) C und kein C++, aber hier trotzdem eine Antwort.

    Ein char kann genau ein Zeichen beinhalten. Mit

    char zeichen = '70';
    

    fügst du aber zwei Zeichen (eine Zeichenkette) hinzu. Dein Compiler sollte dich davor auch warnen. Auf jeden Fall kommt es so zu einem Overflow und "0" wird gespeichert und entsprechend ausgegeben.

    Mit

    zeichen = zeichen + 30;
    

    addierst du jetzt den Integer Wert 30 zu dem in der Variable gespeicherten Wert hinzu. Die Integer Repräsentation von dem Zeichen '0' ist 48. Und 48 + 30 = 78. Die ASCII Repräsentation von dem Integer Wert 78 ist das Zeichen 'N', welches dir ja auch ausgegeben wird.



  • Vielen dank werde das nächste mal hoffentlich das richtige forum erwischen 😃 👍


  • Mod

    Titel: "Frage zu Ausgabe C". Gestellt im C++-Forum. 🙄

    Die Frage kann man nicht allgemein beantworten, die Ausgabe ist implementationsspezifisch. Das liegt daran, dass du zeichen = '70'; geschrieben hast. Du hast wahrscheinlich zeichen = 70; gemeint. Beim ersten hast du ein Multicharliteral. Das ist ein recht spezielles Objekt in C. Es ist keine Zeichenkette, sondern eher eine Art Zahl, deren Wert sich irgendwie aus den Werten der Buchstaben errechnet. Wie genau er sich errechnet, kommt auf den speziellen Compiler an, daher wird dir wohl kaum jemand sagen können, warum bei dir ausgerechnet '0' heraus kommt, wenn man das Ding wieder in einen einzelnen char stopft. Man kann bloß sagen, dass 'N' == '0' + 30, auf den meisten Systemen. insofern ist nicht verwunderlich, dass als zweite Ausgabe 'N' kommt, nachdem die erste '0' war.

    Bei zeichen = 70; ist die 70 hingegen eine ganz normale Zahl. Das heißt, du würdest das Zeichen mit der Nummer 70 bekommen, was in den meisten Systemen 'F' sein solle. Und wenn du später 30 hinzu addierst, bekommst du das Zeichen Nummer 100, was dann 'd' wäre.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Schlangenmensch schrieb:

    Ein char kann genau ein Zeichen beinhalten. Mit

    char zeichen = '70';
    

    fügst du aber zwei Zeichen (eine Zeichenkette) hinzu. Dein Compiler sollte dich davor auch warnen.

    Vorsicht: '70' ist keine Zeichenkette! "70" wäre eine Zeichenkette. '70' ist ein Integerliteral und darf damit ganz regulär einem char zugewiesen werden. Daran darf der Compiler nicht meckern.

    Der Compiler kann/sollte aber warnen (und zumindest GCC tut es auch), dass der Wert rechts größer ist als der Wertebereich eines char; und dass man da überhaupt einen multi-character benutzt hat. Letzteres ist eine Warnung wert, denn kein Mensch benutzt multi-chars, obwohl es ein ganz normales Sprachfeatue ist. Es ist fast immer ein Versehen.



  • Stimmt, Zeichenkette ist das falsche Wort. Wahrscheinlich sollte eine Zeichenkette gespeichert werde, aber das ist nur Spekulation.

    Trotzallem spuckt zumindest der GCC zwei Warnungen aus:
    Multicharackter character constant
    und
    Impliciet Overflow.

    Und ich habe ja nur geschrieben, dass der Compiler warnt.


Anmelden zum Antworten