2013-05-19 9 views

Odpowiedz

30

Tak, robi. Przepełnienie liczb całkowitych ze znakiem jest niezdefiniowanym zachowaniem, więc wszystko może się zdarzyć (włącznie z wyrzucanym wyjątkiem).

Na marginesie muszę przyznać, że jest to mało prawdopodobne (ale na pewno możliwe) dla większości wdrożeń; jak wspomina C++ 11 Standardowy w nocie do ust 5/4:

Jeżeli podczas oceny wyrażenie, wynik nie jest matematycznie zdefiniowana lub nie w zakresie reprezentowalna wartości dla tego typu, zachowanie jest niezdefiniowane. [Uwaga: większość istniejących implementacji C++ ignoruje przepełnienia całkowite. Traktowanie dzielenia przez zero, tworząc pozostałość przy użyciu dzielnika zera, a wszystkie wyjątki zmiennoprzecinkowe różnią się w zależności od komputera i zazwyczaj można je regulować za pomocą funkcji bibliotecznej. -end note]

As hvd mentions in the comments, jednak niektóre implementacje umożliwiają dostarczanie niestandardowych procedur obsługi przepełnienia liczby całkowitej, a te procedury obsługi mogą być wyświetlane.

+2

Touche. To genialne. – chris

+0

Subtelne, ale zdecydowanie możliwe! –

+0

Ponieważ dodawanie liczb całkowitych jest w zasadzie C, nie C++, nie wierzę * każdy * kompilator kiedykolwiek wyrzuciłby dla niego wyjątek. – Dave

4

Zasadą jest, że coś się może być napisany w języku C nie może i nie powinien wyrzucać wyjątek ...

Dlatego też nie.

Jak mówi Andy, takie zachowanie jest nieokreślone, więc wszystko może się zdarzyć. Teoretycznie komputer może również sprawić, że wypijesz filiżankę kawy i zabierzesz psa na spacer. Jednak gdybyś był w rozmowie kwalifikacyjnej, sugerowałbym, żebyś im powiedział: nie;)

+4

Złe zasady są znane z tego, że ranią kciuki. Nie możesz napisać "to" w C, ponieważ podpisane przepełnienie w C nie jest dozwolone, tak jak w C++. –

+0

'sizeof ('a')' może być napisany w C, ale skutkuje różną wartością vaulue (i działa na większości platform).Poza tym - niezdefiniowane zachowanie na C może spowodować wyjątek - spróbuj całkowitoliczbowego dzielenia przez zero, co spowoduje wyjątek sprzętowy na wielu platformach (biorąc pod uwagę, że nie jest to wyjątek C++ ...). –

Powiązane problemy