Warum gibt vector.size()-1 Müllwert? [duplicate]

Lesezeit: 2 Minuten

Benutzer-Avatar
JVJplus

Ich hatte versucht, diesen Code auszuführen

// vector::size
#include <iostream>
#include <vector>

int main ()
{
   std::vector<int> myints;
   std::cout << "size: " << myints.size() << '\n';
   std::cout << "size: " << myints.size()-1 << '\n';

 return 0; 
}

Und überraschenderweise kam der Ausgang

0

Müll Wert

Es sollte sein

0

-1

Hier ist die :Code

  • Schau dir den Typ an.

    – Chris

    6. Februar 2018 um 15:30 Uhr

  • Ich bezweifle ernsthaft, dass Ihr Programm buchstäblich “Garbage Value” ausgibt.

    – molbnilo

    6. Februar 2018 um 15:30 Uhr

  • Es sollte nicht sein. Es ist ein vorzeichenloser Typ, es gibt keine negativen Werte.

    – Justin Randall

    6. Februar 2018 um 15:32 Uhr


  • @molbdnilo: Das ist eine gute Frage. Ich muss es überprüfen, aber ich denken das Verhalten von cout ist die Implementierung definiert für unsigned Typen ab einer bestimmten Größe. Scheint, dass theoretisch “Garbage Value” vom Standard erlaubt ist.

    – Bathseba

    6. Februar 2018 um 15:37 Uhr

  • @ Bathsheba, soweit ich das beurteilen kann operator<< und num_put::do_putein unsigned long long Standardmäßig werden andere Einstellungen wie ein Aufruf an ausgegeben printf("%ull", val), und ebenso für andere grundlegende unsigned Typen. Ich bin mir nicht sicher, ob Sie ein potenzielles Problem haben würden size_tda es entweder zu einer Überladung passen oder eine Mehrdeutigkeit verursachen würde.

    – Chris

    6. Februar 2018 um 16:16 Uhr


myints.size() ist ein ohne Vorzeichen Typ: formal a std::vector<int>::size_type. Subtrahieren 1 von einem vorzeichenlosen Typ mit einem Wert von 0 führt in Ihrem Fall zu Wrap-Around-Effekten

std::numeric_limits<std::vector<int>::size_type>::max()

Es würde nicht haben “Müllwert” gedruckt: aber die Zahl oben, die eins weniger als eine große Potenz von 2 sein wird.

1012380cookie-checkWarum gibt vector.size()-1 Müllwert? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy