PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konfus: C++ und if-Anweisung



bischi
10-12-2004, 12:06
Hier zwei Files, beide bis auf Zeile 19 identisch (und meiner Meinung nach logisch identisch...). Jedoch geben sie mir andere Resultate zurück - hat jemand ne Erklärung? (Nein, ich will nicht wissen, wie ich das Problem umgehen kann, sondern wie es entsteht...)


#include<iostream>
#include<cctype>


// wordcount
// PRE: Einen String
// PRE: gibt durch whitespaces getrennte W??rter zur??ck

unsigned int wordcount(std::string& s)
{
unsigned int anzahl = 0;

if(!std::isspace(s[0])){
anzahl=1;
}

for(int i=0; i<s.length()-2;i++){

if(std::isspace(s[i]) && std::isspace(s[i+1])==false){
anzahl++ ;

}
}

return anzahl;
}



int main()
{
std::string Satz= "hallo Welt wie gehts?";

std::cout << wordcount(Satz) << std::endl;

return 0;

}




#include<iostream>
#include<cctype>


// wordcount
// PRE: Einen String
// PRE: gibt durch whitespaces getrennte Wörter zurück

unsigned int wordcount(std::string& s)
{
unsigned int anzahl = 0;

if(!std::isspace(s[0])){
anzahl=1;
}

for(int i=0; i<s.length()-2;i++){

if(std::isspace(s[i])==true && std::isspace(s[i+1])==false){
anzahl++ ;

}
}

return anzahl;
}



int main()
{
std::string Satz= "hallo Welt wie gehts?";

std::cout << wordcount(Satz) << std::endl;

return 0;

}




Mfg Bischi

locus vivendi
10-12-2004, 12:34
Naja, die Erklärung ist letzendlich wohl ziemlich einfach: Der Wert von true ist 1, das wurde so definiert, und wenn dieser Wert mit einem int ungleich 1 verglichen wird dann ergibt das ganze false. Eine tiefergreifende Erklärung dafür habe ich auch nicht.

Joghurt
10-12-2004, 14:16
Naja, die Erklärung ist letzendlich wohl ziemlich einfach: Der Wert von true ist 1, das wurde so definiert, und wenn dieser Wert mit einem int ungleich 1 verglichen wird dann ergibt das ganze falseNee, wenn int nach bool konvertiert wird, gilt: 0 => false, alles andere => true

peschmae
10-12-2004, 14:41
std::isspace(s[i]) && std::isspace(s[i+1])==false

Teil 1 guckt: Ist std::isspace(s[i]) true, d.h. nicht 0. Gibt true für alle std::isspace(s[i]) die nicht 0 sind.


std::isspace(s[i])==true && std::isspace(s[i+1])==false

Teil 1 guckt: Ist std::ispace(s[i]) == true, d.h. ist es 1 wie locus vivendi gesagt hat. Gibt also false für std::ispace(s[i]) etwas anderes als 1.

MfG Peschmä

bischi
10-12-2004, 16:22
Tja - ich hab glaub ich nichts verstanden: Wenn ich ne Funktion - die ein boolean zurückgibt - mit einem boolean vergleiche, sollte das doch kein Problem sein (zumindest in Java geht das afaics problemlos)! (oder gibt isspace gar kein boolean zurück, sondern ne Zahl?)

MfG Bischi

chrizel
10-12-2004, 16:41
(oder gibt isspace gar kein boolean zurück, sondern ne Zahl?)

Ja. siehe "man isspace". isspace gibt int zurueck. Und dieser muss ja nicht unbedingt immer 1 oder 0 sein. Hanegt davon ab wie isspace implementiert ist.



The isspace() function returns zero if the character tests false and
returns non-zero if the character tests true.

peschmae
10-12-2004, 17:07
Bei mir gibts recht gerne 8192 zurück - k.A. wieso und k.A. ob das was heissen soll. Ist aber auch egal :)

MfG Peschmä

Joghurt
10-12-2004, 17:13
Ich bin immer noch verwirrt, IIRC operiert der "&&" Operator mit bools, der int müsste also implizit auf bool gecastet werden, wie oben beschrieben... :confused:

anda_skoa
10-12-2004, 17:22
Schon, aber der Wert den isspace zurück gibt ist wahrscheinlich nicht der int Wert von true, damit ist der Vergleiche "== true" nicht wahr.

isspace(c) ist nicht äquivalent zu isspace(c) == true, man könnte aber isspace(c) != 0 schreiben.

Ciao,
_

locus vivendi
10-12-2004, 19:41
Ich bin immer noch verwirrt, IIRC operiert der "&&" Operator mit bools, der int müsste also implizit auf bool gecastet werden, wie oben beschrieben...
Im Grunde wurde von den Anderen schon alles wichtige geschrieben, aber dennoch hier noch einmal im Zusammenhang:
Also im ersten Beispiel der erste Teil (vor dem "&&") von

if(std::isspace(s[i]) && std::isspace(s[i+1])==false),
dafür gilt das natürlich, "&&" konvertiert seine Operanden nach bool. Allerdings gilt das für "==" nicht. Dort werden die Operanden zu Integralen Typen (*) konvertiert. Und für "false" und "true" gilt, das sie zu 0 respektive 1 werden wenn sie in einen Integralen Typen konvertiert werden.

*Weiß eigentlich jemand ob es auf Deutsch "Integraler Typ" oder "Integer Typ" heißen sollte?

peschmae
10-12-2004, 22:07
*Weiß eigentlich jemand ob es auf Deutsch "Integraler Typ" oder "Integer Typ" heißen sollte?

Hab ich noch nie gehört/gelesen. Ganzzahltyp ;)
Aber auch "integral type" ist mir noch nicht wirklich oft begegnet (hab gerade im Stroustroup nachgeguckt, dort hats 3 Seiten wo das vorkommt ;))
Sehe aber nicht ganz wieso man da nicht integer sagen kann :confused:

MfG Peschmä

Joghurt
10-12-2004, 23:26
Integer = Ganzzahl