n>=vec.size() true bei n<0. Warum?



  • Also, ich habe folgenden (verkuerzten) Code (muss abtippen, ignoriert bitte Tippfehler. Der Code compiliert im Original):

    int n;
    std::cin>>n;
    std::cout<<n;
    while(/*n<-1 &&*/ n>=vec.size())
    {
        std::cout<<"Invalid number\n";
        std::cin>>n;
    }
    

    vec.size() ist im Testfall bei mir jetzt 2 gewesen (wird kurz vorher auch ausgegeben) Das auskommentierte in der while Kondition stand in der urspruenglichen Version auch drin, habs wegen Fehlersuche nur mal auskommentiert.

    Das ganze soll also simpel darauf hinauslaufen, dass n entweder ein valabler Index oder -1 (=Abruch) ist. Nun ist es aber so, dass er mir bei allen negativen Werten und allen Werten ueber 2 (letztere ja beabsichtigt) die While schleife ausfuehrt. Ob ich nun -1, -2 oder was auch immer eingebe (und diese werden auch richtig durch das (nachtraeglich) eingefuegte cout ausgegeben), er schreibt mir "Invalid number"

    Woran koennte das liegen?



  • Hat der Compiler dich nicht gewarnt?

    Der Rückgabetyp von vector::size ist vorzeichenlos, du vergleichst also einen vorzeichenlosen Wert mit einem vorzeichenbehafteten. Dazu wird implizit der vorzeichenbehaftete (in deinem Fall n) in einen vorzeichenlosen Wert umgewandelt. Was dadurch mit negativen Werten passiert, kannst du dir ja vorstellen.



  • achso, nein, eine Warnung gabs glaub ich nicht (komisch, ich dachte VC++ Express sei recht gut)

    heisst also bei Vergleich unsigned mit signed wird signed konvertiert, ja? Wusste ich bisher noch nicht. Aber... in WAS wird der denn konvertiert? Das Zeichen wird ja wohl nicht einfach weggelassen (wie gesagt, im Beispiel ist vec.size()==2 und wenn man bei -1 das Zeichen weg nimmt ist das ja immer noch kleiner als 2. (vermuten wuerde ich, dass es auf den maximalen unsigned int Wert konvertiert wird)

    Heisst das also gleichzeitig auch, dass ich eigentlich NIE

    if(index>=0 && index<vec.size())
     vec[index]=bla;
    

    zu schreiben brauche, weil bei einem negativen index eh immer die 2. Bedingung nicht erfuellt ist? Oder macht man das der ueberishctlichkeit und/oder Sicherheit wegen doch?

    Und letzte Frage: das laesst sich dann wohl mit einem n>=(signed int)vec.size() umgehen, oder?



  • Nein, das Vorzeichen wird nicht geschluckt. Stattdessen erhältst du den unsigned int, der durch die Bitfolge von '-2' dargestellt wird (müsste afair UINT_MAX-1 sein).



  • danke, dann lag ich ja sogar richtig.



  • Shinja schrieb:

    achso, nein, eine Warnung gabs glaub ich nicht (komisch, ich dachte VC++ Express sei recht gut)

    Stell mal das Warnlevel auf 4 (was generell eine gute Idee ist), dann sollte auch eine Warnung kommen.



  • Mach ich, danke


Log in to reply