2016-05-26 6 views
-5
#include<iostream> 
#include<string> 
#include<sstream> 

using namespace std; 

int main(){ 
    stringstream ss; 
    ss << 32; 
    string str = ss.str(); 
    cout << str << endl 
     << str[0] << endl 
     << str[1] <<endl 
     << str[0]%10; 
    return 0; 
} 

Der Ausgang ist:Warum gibt der Modulo-Operator eine falsche Antwort?

Stattdessen sollte die letzte Zeile 3 sein als 3% 10 = 3.

+5

str [0] ist 51 und 51% 10 ist 1 – immibis

+0

Was bekommen Sie, wenn Sie 'cout << + str [0];' und 'cout << (str [0] - '0')' 'drucken ? –

Antwort

5

Weil Sie es mit dem ASCII-Wert vergleichen, der 51 ist (0 ist 48), Modding, das Ihnen 1 gibt. Sie sollten '0' oder 48 subtrahieren, um die echte Zahl aus dem Auto zu erhalten.

+0

Ich empfehle immer Subtraktion '0'. Die Absicht von '0' ist nicht nur auf eine Weise, die 48 nicht ist, sofort offensichtlich, dies wird auch auf die meisten Systeme übertragen, die nicht auf ASCII basieren und die Zahlen nicht in einer ungewöhnlichen Weise angeordnet haben. – user4581301

3

Die Darstellung eines Zeichens unterscheidet sich von der Darstellung einer Zahl. Selbst wenn das Zeichen bei str[0] 3 ist, ist es das Zeichen 3, dessen ASCII-Code (dh seine numerische Darstellung) 51 ist. Da Zeichen implizit in eine Ganzzahl umgewandelt werden können, wenn Sie eine Ganzzahl ausführen, führt der Code 51%10 aus, was 1 ist.

Verwandte Themen