2016-03-30 24 views
2

Ich bin ziemlich neu in C++ und ich habe ein wenig Verständnis für Zeichen Subtraktion in C++.Char Subtraktion in C++

hatte ich diesen Code intially

char x='2'; 
x-='0'; 
if(x) cout << "More than Zero" << endl; 

Diese Mehr als Null zurück als Ausgang so den Wert von x zu wissen, dass ich diesen Code versucht.

char x='2'; 
x-='0'; 
if(x) cout << x << endl; 

Und ich bin immer Null-Zeichen (oder eine neue Zeile) als Ausgabe.

Jede Hilfe wird geschätzt.

+1

versuchen, '2' und '0' nacheinander auszugeben, und dann schauen Sie sich diese [Tabelle] (http://www.asciitable.com/) an und sehen, was der Wert von 2 ist und char. – Incomputable

+0

@ kobe24 weil ''2' - '0' == 2' (und' 2' ist kein _printable_ Zeichen). –

+0

@DimChtz Nur weil 'x - = char (0);' ist das gleiche wie 'x - = 0;', also ist 'x' unverändert. – molbdnilo

Antwort

4

Nach dem C++ Standard (2.3 Zeichensätze)

  1. ... In beiden Quell- und Ausführungsgrundzeichensätze, den Wert von jedes Zeichen nach 0 in der obigen Liste der Dezimalziffern soll eins größer als der Wert der vorherigen sein.

also die Codes benachbarter Ziffern in jedem Zeichensatz unterscheiden sich um 1.

So ist in diesem Codefragment

char x='2'; 
x-='0'; 
if(x) cout << x << endl; 

die Differenz zwischen '2' und '0' (die Differenz zwischen den Codes, die stellen Sie diese Zeichen dar, zB in ASCII sind diese Codes 0x32 und 0x30, in EBCDIC sind sie 0xF2 und 0xF0 entsprechend) ist gleich 2.

prüfen Sie dies zum Beispiel die folgende Art und Weise

if(x) cout << (int)x << endl; 

oder

if(x) cout << static_cast<int>(x) << endl; 

Wenn Sie nur

if(x) cout << x << endl; 

dann der Operator x als < < versucht, Ausgabe schreiben druckbares Zeichenbild des Wertes 2 weil x vom Typ char ist.

+0

habe ich verstanden, warum ich keine Ausgabe bekam, wenn ich x auf mehr als eine Ziffer initialisiere (wie '20') und versuche, den Unterschied auszudrucken – kobe24

+0

@ kobe24 Multibyte-Zeichenliterale haben Implementierung definierte Werte und geben int ein. –

1

Du Substraktion 48 (ASCII-Zeichen '0') auf das Zeichen 50 (ascii '2')

50 - 48 = 2 
if (x) ' true 
1

In C++ sind alle Zeichen durch einen ASCII-Code dargestellt (siehe http://www.asciitable.com/) Ich denke, das zu tun:

'2' - '0'

ist wie tun

50 - 48 = 2

Nach der ASCII-Tabelle, der ASCII-Code für Beginn des Textes steht, die nicht von cout angezeigt wird.

Ich hoffe, es hilft.

+0

Der Standard erfordert kein ASCII. – molbdnilo

+0

danke für die Einsicht, initialisierte ich x bis 100 ohne Apostroph und druckte den Wert es gab 'd' als vorhanden in asciitable – kobe24

2

In C/C++ Zeichen sind als 8-Bit-Ganzzahlen mit ASCII-Codierung gespeichert. Also, wenn Sie x-='0'; tun, subtrahieren Sie den ASCII-Wert von '0', der 48 von dem ASCII-Wert von '2' ist, die 50 ist. X ist dann gleich 2, das ist ein spezielles Steuerzeichen STX (Anfang des Textes) , die nicht druckbar ist.

Wenn Sie arithmetische Operationen an Zeichen durchführen möchten, ist es besser, vor jedem Vorgang '0' von jedem Zeichen zu subtrahieren und '0' zum Ergebnis hinzuzufügen. Um Probleme wie das Überfahren des Bereichs des 8bit-Wertes zu vermeiden, würde ich vorschlagen, sie auf Ints oder Longs zu setzen.

char x = '2'; 
int tempVal = x - '0'; 
/* 
Some operations are performed here 
*/ 
x = tempValue % 10 + '0'; 
// % 10 - in case it excedes the range reserved for numbers in ASCII 
cout << x << endl; 

Es ist viel sicherer, diese Operationen auf größeren Werttypen durchzuführen, und der Charakter der ‚0‘ subtrahieren können Sie Operationen unabhängig von der ASCII-Codierung auszuführen, wie Sie mit lässigen ganzen Zahlen tun würde. Dann fügen Sie '0' hinzu, um zur ASCII-Codierung zurückzukehren, mit der Sie eine Zahl drucken können.

1

Also, was Ihr Code tut, ist die folgende:

x = '2', die in der ASCII-Tabelle 50 als Dezimalwert darstellt.

dann sind Ihre im Grunde sagen:

x = x - '0', wobei Null in der ASCII-Tabelle als 48 in dezimal dargestellt, die = an x ​​entspricht 50 - 48 = 2.

Beachten Sie, dass 2! = '2'. Wenn Sie in der ASCII-Tabelle 2 (dezimal) nachschlagen, erhalten Sie einen STX (Anfang des Textes). Das macht dein Code. Beachten Sie also, dass die Subtraktion auf dem Dezimalwert des Zeichens stattfindet.