Czy standard pozwala na to?Czy standard C++ zezwala na dodanie dwóch liczb całkowitych (typu podstawowego), aby rzucić wyjątek C++?
Nie sądzę, że tak. Ktoś to robi. Potrzebuję inteligentnych ludzi, żeby udowodnić mu, że się myli.
Czy standard pozwala na to?Czy standard C++ zezwala na dodanie dwóch liczb całkowitych (typu podstawowego), aby rzucić wyjątek C++?
Nie sądzę, że tak. Ktoś to robi. Potrzebuję inteligentnych ludzi, żeby udowodnić mu, że się myli.
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.
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;)
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++. –
'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++ ...). –
'go' ... kogo? – iammilind
@iammilind: losowa osoba w interwebz. – rubenvb
obowiązkowe xkcd: https://xkcd.com/386/ – heinrich5991