Sorry für die erste Antwort, hier ist eine Erklärung von den C++ Standards :)
Ist der Ausgang in keiner Weise vorhersehbar oder seine undefinierte ??
Es ist vorhersehbar. Es gibt zwei Punkte, nachdem in diesem Code suchen: Zunächst wird die Zuordnung von Wert, dass der Typ unsigned char
nicht halten kann:
unsigned char c;
c = 300;
3.9.1 Grundtypen (Seite 54)
unsigned Integer, erklärt unsigned, werden die Gesetze der Arithmetik Modulo 2n gehorchen, wobei n die Anzahl der Bits in der Wertdarstellung von , die bestimmte Größe integer.41 ist)
...
41) Dies bedeutet, dass unsigned Arithmetik nicht überläuft, weil ein Ergebnis, das nicht durch die sich ergebende unsigned integer Typ reduziert dargestellt werden kann, die Anzahl, die man modulo größer ist als der größte Wert ist, dass kann durch den resultierenden vorzeichenlosen Integer-Typ dargestellt werden.
Grundsätzlich gilt:
c = 300 % (std::numeric_limits<unsigned char>::max() + 1);
Zweitens %d
im Formatstring von printf
unsigned char
Variable drucken vorbei.
Dieser ysth hat es richtig;) Es gibt kein undefiniertes Verhalten, weil eine Promotion-Konvertierung von unsigned char zu Int passiert im Fall variadic arguments
!
Hinweis: dass der zweite Teil der Antwort ist ein Umformulierung von dem, was in the comments of this answer gesagt wurde, aber es ist nicht meine Antwort ursprünglich.
"numeric_limit" ist eigentlich "numeric_limits" –
Wo kann ich all diese C++ - Standards lesen? –
Sie müssen die offiziellen Dokumente kaufen, wenn Sie möchten, oder gehen Sie einfach auf http://www.open-std.org/jtc1/sc22/wg21/ und laden Sie den neuesten Entwurf kostenlos herunter: http: //www.open- std.org/jtc1/sc22/wg21/docs/papers/2009/n3000.pdf – AraK