Zeichen nach Ganzzahlqualifizierer ausgeben

8

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?

    
Aravindan Chandrasekaran 12.08.2013, 09:36
quelle

4 Antworten

18

Ein Zeichen, das mit 0 to 7 für Oktanzahl beginnt, ist das Basis-8-Nummernsystem und verwendet das Ziffern . Also '' ist ungültig Darstellung der oktalen Zahl, weil 8 ∉ [0, 7] , daher erhalten Sie implementierungsdefiniertes Verhalten.

Wahrscheinlich erkennt Ihr Compiler ein Multibyte-Zeichen ''8'' als '' ein Zeichen und ''8'' als ein anderes und interpretiert als '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.

    
Maroun 12.08.2013 09:41
quelle
7

Der Wert '' wird als mehrstellige Konstante betrachtet, bestehend aus 8 (was die Zahl 0 ergibt) und dem ASCII-Zeichen '' (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" .

    
DarkDust 12.08.2013 09:53
quelle
4

0->7 wird verwendet, um Oktalzahlen in C / C ++ darzustellen. Die Oktalgrundzahlen stammen aus , also ist eine aus mehreren Zeichen bestehende Konstante, bestehend aus 8 , der Compiler interpretiert '8' als 56 + 56 , was %code% zu seinem ascii-Wert macht %code% . Deshalb erhalten Sie %code% als Ausgabe.

    
Umer Farooq 12.08.2013 09:43
quelle
4

Wie andere Antworten schon sagten, stellen diese Zahlen oktale Zeichen dar (Basis 8). Dies bedeutet, dass Sie '0' für 8, '1' für 9 usw. schreiben müssen.

Es gibt andere Möglichkeiten, Ihre Zuweisung zu schreiben:

%Vor%     
tohava 12.08.2013 09:47
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ answer18220463 ___

Karte ist eine Schnittstelle. Sie müssen Java mitteilen, welche konkrete Map-Klasse Sie instanziieren möchten.

%Vor%

oder

%Vor%

usw.

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123list ___ Liste kann sich beziehen auf: eine verkettete Liste (eine geordnete Menge von Knoten, die jeweils auf ihren Nachfolger verweisen) oder eine Form eines dynamischen Arrays. Um nicht für HTML-Listen verwendet zu werden, verwenden Sie stattdessen [html-lists]. ___ tag123map ___ Ein Wörterbuch (oder eine Karte) in der Informatik ist eine Datenstruktur, die Schlüssel auf Werte abbildet, so dass der entsprechende Wert eines Schlüssels effizient abgerufen werden kann. Bei Fragen zu Mapping-Funktionen über Datensammlungen verwenden Sie bitte das Tag [map-function]; und für Geographie, [Karten]. ___ tag123generische Programmierung ___ Eine Art der Programmierung, bei der Algorithmen abstrakt von konkreten Datentypen implementiert werden. Gewöhnlich wird auf stark typisierte Sprachen Bezug genommen. Dieser Begriff wird normalerweise als Software erstellt, die hinsichtlich der Anforderungen des Datentyps minimal ist und für jeden übereinstimmenden Datentyp instanziiert werden kann, ohne den Angerufenen-Code zu ändern. ___ answer18220450 ___
%Vor%

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.

    
___ answer18220455 ___

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%     
___