Ich versuche das folgende Programm auszuführen.
%Vor% Ich bekomme die Ausgabe als 56
. Aber für jede andere Zahl als 8
ist die Ausgabe die Zahl selbst, aber für 8
lautet die Antwort 56
.
Kann jemand erklären?
Ein Zeichen, das mit
für Oktanzahl beginnt, ist das Basis-8-Nummernsystem und verwendet das Ziffern 0 to 7
. Also
''
ist ungültig Darstellung der oktalen Zahl, weil 8 ∉ [0, 7] , daher erhalten Sie implementierungsdefiniertes Verhalten.
Wahrscheinlich erkennt Ihr Compiler ein Multibyte-Zeichen '
als '8'
'''
ein Zeichen und '
als ein anderes und interpretiert als '8'
''8'
als '8'
+ %code% , was %code% ergibt. Wenn Sie sich die Tabelle ASCII ansehen, stellen Sie fest, dass der Dezimalwert von %code% 56 ist.
Danke an @DarkDust, @GrijeshChauhan und @EricPostpischil.
Der Wert ''
wird als mehrstellige Konstante betrachtet, bestehend aus
(was die Zahl 0 ergibt) und dem ASCII-Zeichen 8
''
(das als Dezimalzahl ausgewertet wird) 56). Wie es interpretiert wird, ist die Implementierung definiert. Der C99-Standard sagt:
Eine Ganzzahl-Zeichenkonstante hat den Typ int. Der Wert einer Ganzzahl Zeichenkonstante, die ein einzelnes Zeichen enthält, das auf a Single-Byte-Ausführungszeichen ist der numerische Wert der Darstellung des abgebildeten Zeichens als Ganzzahl interpretiert. Der Wert einer ganzzahligen Zeichenkonstante, die mehr als eins enthält Zeichen (z. B. "ab") oder ein Zeichen oder eine Escape-Sequenz enthalten das nicht einem Ein-Byte-Ausführungszeichen zugeordnet ist, ist implementierungsdefiniert . Wenn eine ganzzahlige Zeichenkonstante enthält a Einzelzeichen oder Escape-Sequenz, der Wert ist derjenige, der sich ergibt wenn ein Objekt mit dem Typ char, dessen Wert der Wert des einzigen ist Zeichen- oder Escapesequenz wird in den Typ int konvertiert.
Wenn Sie also char
einem größeren als einem int
zuweisen würden, wie long
oder char
, wäre es sogar gültig. Aber da Sie es einem 8
zuweisen, "schneiden" Sie einen Teil ab. Welcher Teil ist wahrscheinlich auch von der Implementierung / Maschine abhängig. In Ihrem Fall gibt es Ihnen den Wert von %code% (das ASCII-Zeichen, das die Zahl 56 ergibt).
Sowohl GCC als auch Clang warnen vor diesem Problem mit "Warnung: Konstanten aus mehreren Zeichen" .
wird verwendet, um Oktalzahlen in C / C ++ darzustellen. Die Oktalgrundzahlen stammen aus 0->7
, also ist
eine aus mehreren Zeichen bestehende Konstante, bestehend aus
, der Compiler interpretiert 8
'8'
als 56
+ 56
, was %code% zu seinem ascii-Wert macht %code% . Deshalb erhalten Sie %code% als Ausgabe.
Tags und Links c++
Karte ist eine Schnittstelle. Sie müssen Java mitteilen, welche konkrete Map-Klasse Sie instanziieren möchten.
%Vor%oder
%Vor%usw.
oder wie gparyani kommentierte:
%Vor%Hinweis: Jeder Eintrag muss eine instanziierte Liste als Wert erhalten. Sie können nicht erhalten ("myKey"). Add ("some_string_for_this_key"); Beim allerersten Mal bekommst du eine Liste davon.
Also, holen Sie eine Liste, überprüfen Sie, ob es null ist.
Wenn es null ist, erstellen Sie eine neue Liste, fügen Sie die Zeichenfolge hinzu, legen Sie die Liste zurück. Wenn es alles andere als null ist, füge es hinzu oder mach was du willst.
Sie haben vergessen, die Klasse zu erwähnen. %code% ist hier der Referenztyp und ist eine Schnittstelle . %code% auf der anderen Seite von equals gibt den tatsächlichen -Typ des Objekts an, das erstellt und dem Verweis %code% zugewiesen wurde.
%Vor%Der angegebene tatsächliche Typ ( %code% hier) muss dem Referenztyp zuweisbar sein ( %code% hier), dh wenn der Referenztyp eine Schnittstelle ist, der Typ des Objekts muss implementieren . Und wenn der Typ des Verweises eine Klasse ist, muss der Typ des Objekts entweder dieselbe Klasse oder sein Subtyp sein, dh er erstreckt sich davon .
Ab Java 7 können Sie eine Kurzschrift wie
verwenden %Vor%Ihre zweite Art der Instanziierung ist nicht empfohlen. Bleiben Sie bei der Verwendung von %code% , das eine Schnittstelle ist.
%Vor%