Archiv verlassen und diese Seite im Standarddesign anzeigen : Konfus: C++ und if-Anweisung
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.
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ä
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
(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ä
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ä
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.