Anzeige:
Ergebnis 1 bis 12 von 12

Thema: Konfus: C++ und if-Anweisung

  1. #1
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828

    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...)

    Code:
     #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;
      
    }
    Code:
    #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

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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.

  3. #3
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von locus vivendi
    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
    Nee, wenn int nach bool konvertiert wird, gilt: 0 => false, alles andere => true

  4. #4
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Code:
    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.

    Code:
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  5. #5
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    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

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  6. #6
    Registrierter Benutzer
    Registriert seit
    27.04.2001
    Beiträge
    62
    Zitat Zitat von 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.

  7. #7
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  8. #8
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Ich bin immer noch verwirrt, IIRC operiert der "&&" Operator mit bools, der int müsste also implizit auf bool gecastet werden, wie oben beschrieben...

  9. #9
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  10. #10
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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
    Code:
    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?

  11. #11
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von locus vivendi
    *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

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  12. #12
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Integer = Ganzzahl

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •