Strings | Mathematischer Aspekt.
-
1.) Dein Problem ist unklar.
2.) Das ist Quatsch:int Haus = 'Haus'; int sauH = 'sauH';
Mathematische Aspekt an dieser Geschichte
Haeh? Warum sollten Strings gleich sein, wenn die Summe ihrer "Zeichen" gleich sind?
So lief es nicht. Also habe ich mir eine andere Theorie überlegt.
Vielleicht solltest du dir keine wilden Theorien ueberlegen und an geeigneter Stelle nachlesen.
-
knivil schrieb:
2.) Das ist Quatsch:
int Haus = 'Haus'; int sauH = 'sauH';
Es gibt durchaus Fälle, wo das so gewollt steht.
-
Anfänger53 schrieb:
Also habe ich mir eine andere Theorie überlegt.
Man lernt keine Programmiersprache, indem man sich Theorien überlegt. Du bist auf dem total falschen Dampfer. Damit meine ich, dass es überhaupt keinen Sinn in Standard-C++ ergibt, sich zu fragen, was 'Haus' oder 'hauS' bedeutet. Mit ' umschließt du einzelne Zeichen und mit " umschließt du Zeichenketten. Fertig aus.
-
Es gibt durchaus Fälle, wo das so gewollt steht.
Bullshit.
-
knivil schrieb:
Es gibt durchaus Fälle, wo das so gewollt steht.
Bullshit.
-
Anfänger53 schrieb:
Mein Experiment: int a = 'H', b = 'a', c = 'u', d = 'a'; int e = 's', f = 'a', g = 'u', h = 'H';
"Haua" und "sauH"?!
War nicht "Haus" Ausgangspunkt für Dein "Experiment"?Übrigens ist Deine erste Annahme richtig (Kommutativgesetz):
'H' + 'a' + 'u' + 's' == 's' + 'u' + 'a' + 'H'
-
Ach übrigens, Strings werden Zeichen für Zeichen nach dem ASCII Code verglichen (standardmäßig)...
-
mitsosse schrieb:
Ach du meinst, das mit Praeprozessordirektiven vollgestopfte boost::ding kann mit der einfachen Zeile in Verbindung gebracht werden?
Hast du
mpl::string<'hell','o wo','rld'>
mal hinterfragt? Wie sieht das Konstrukt aus, nachdem der Praeprozessor damit fertig ist.
-
Nathan schrieb:
Ach übrigens, Strings werden Zeichen für Zeichen nach dem ASCII Code verglichen (standardmäßig)...
Danke, dass veranlasst mich weiter zu machen.
Zu den anderen Antworten ich habe damit gemeint, das sich hinter jedem Buchstaben ein ASCII-Code verbirgt und ich die ASCII-Codes als Zahlen gesehen habe. Mir kam es nur auf den Zahlen Wert hinter dem String an. Ich wollte Wissen wie die letzten 2 Zahlen entstanden sind. Wie das System auf so etwas kommt. Es tut mir leid, wenn ich mich falsch ausgedrückt habe.
-
knivil schrieb:
mitsosse schrieb:
Ach du meinst, das mit Praeprozessordirektiven vollgestopfte boost::ding kann mit der einfachen Zeile in Verbindung gebracht werden?
Hast du
mpl::string<'hell','o wo','rld'>
mal hinterfragt? Wie sieht das Konstrukt aus, nachdem der Praeprozessor damit fertig ist.Naja, genau gleich wie vorher. Der Präprozessor ist nur dazu da, variadische Templates zu simulieren.
-
Anfänger53 schrieb:
Nathan schrieb:
Ach übrigens, Strings werden Zeichen für Zeichen nach dem ASCII Code verglichen (standardmäßig)...
Danke, dass veranlasst mich weiter zu machen.
Zu den anderen Antworten ich habe damit gemeint, das sich hinter jedem Buchstaben ein ASCII-Code verbirgt und ich die ASCII-Codes als Zahlen gesehen habe. Mir kam es nur auf den Zahlen Wert hinter dem String an. Ich wollte Wissen wie die letzten 2 Zahlen entstanden sind. Wie das System auf so etwas kommt. Es tut mir leid, wenn ich mich falsch ausgedrückt habe.
Ein string ist ein array von chars, und ein char ist nur eine auf eine spezielle Art interpretierte Ganzzahl mit 1 byte Länge.
Wenn du zwei strings vergleichst, dann wird das einfach elementweise gemacht.
Die beiden Zahlen die du für 'Haus' und 'suaH' bekommen hast ist aber irgendwas Seltsames, dass erstens mit irgendwelchen Vergleichen nicht viel zu tun hat und mir, zweitens, auch nichts sagt. Wie etwas weiter oben jemand erwähnt hat, erstellt man zwischen den einzelnen Apostrophen (') einzelne chars und nicht strings (viele einzelne chars in einem array zusammengefasst).
Man müsste erstmal rausfinden, was ein so multibyte-char sein soll und wie seine integer-Repräsentation aussieht.
-
Anfänger53 schrieb:
Zu den anderen Antworten ich habe damit gemeint, das sich hinter jedem Buchstaben ein ASCII-Code verbirgt und ich die ASCII-Codes als Zahlen gesehen habe. Mir kam es nur auf den Zahlen Wert hinter dem String an.
Das ist für die meisten Plattformen ja auch richtig. Dafür braucht es aber keine Experimente sondern Quellen - Dein Buch z.B.
Anfänger53 schrieb:
Ich wollte Wissen wie die letzten 2 Zahlen entstanden sind. Wie das System auf so etwas kommt. Es tut mir leid, wenn ich mich falsch ausgedrückt habe.
Ob die Werte Sinn ergeben oder nicht ist vom Hersteller Deines Compilers abhängig (implementation-defined) Im Standard:
2.14.3/1
A character literal is one or more characters enclosed in single quotes, as in ’x’, optionally preceded by
one of the letters u, U, or L, as in u’y’, U’z’, or L’x’, respectively. A character literal that does not begin
with u, U, or L is an ordinary character literal, also referred to as a narrow-character literal. An ordinary
character literal that contains a single c-char has type char, with value equal to the numerical value of the
encoding of the c-char in the execution character set. An ordinary character literal that contains more than
one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined
value.gcc interpretiert es wie folgt:
#include <iostream> int main(){ const int Haus = static_cast<int>( (unsigned char)'H' * 256 * 256 * 256 + (unsigned char)'a' * 256 * 256 + (unsigned char)'u' * 256 + (unsigned char)'s'); std::cout << "'Haus': " << 'Haus' << " == " << Haus << '\n'; }
-
Ein string ist ein array von chars, und ein char ist nur eine auf eine spezielle Art interpretierte Ganzzahl mit 1 byte Länge.
Wenn du zwei strings vergleichst, dann wird das einfach elementweise gemacht.
Die beiden Zahlen die du für 'Haus' und 'suaH' bekommen hast ist aber irgendwas Seltsames, dass erstens mit irgendwelchen Vergleichen nicht viel zu tun hat und mir, zweitens, auch nichts sagt. Wie etwas weiter oben jemand erwähnt hat, erstellt man zwischen den einzelnen Apostrophen (') einzelne chars und nicht strings (viele einzelne chars in einem array zusammengefasst).
Man müsste erstmal rausfinden, was ein so multibyte-char sein soll und wie seine integer-Repräsentation aussieht.
'H' Array 0
'a' Array 1
'u' Array 2
's' Array 3Das ist mir bewusst, aber ich habe mir gedachte, dass das System die einzelnen Buchstaben in die ACCI-Codes konvertiert, sodass
ASCII-Code von H Array 0
ASCII-Code von a Array 1
ASCII-Code von u Array 2
ASCII-Code von s Array 3Ich wollte es Mathematisch darstellen, aber ist mir anscheint nicht gelungen.
Da ich jetzt weiß, dass bei einem Vergleich die Arrays miteinander verglichen werden ist es ok. Leider gibt es ASCII-Code Vergleiche, wenn ich sage 'a' < 'b' werden die ASCCI-Codes verglichen. Ich muss mehr lernen um später noch einmal zu schauen. Alles eine Frage der Zeit.
-
'Haus' ist kein Array! Es ist ein multi-char Literal. Der Typ dieses Ausdrucks int. Der Wert davon ist "implementation-defined". Das ist ein wichtiges Wort aus dem C++ ISO Standard. Es sagt, dass diejenigen, die einen C++-Compiler bauen, sich selbst überlegen können, was dabei rauskommen soll und dies auch dokumentieren müssen. Beim GCC z.B. findet man das hier. Bei anderen Compilern kann das völlig anders aussehen. Ob der Wert von 'A' wirklich 65 ist (wie man das bei ASCII erwarten würde) oder nicht, ist auch "implementation-defined".
Hausaufgaben für Dich:
- gescheites C++ Buch besorgen
- nachgucken, was "implementation-defined", "undefined behaviour" und "unspecified behaviour" im Kontext von C und C++ genau bedeuten.
- Suche für jeden dieser Begriffe noch jeweils einen Aspekt der Sprache C++, auf den der Begriff passt.