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
-
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 wahrscheinlichzeichen = 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.
-
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.