1樓:麻辣牛肉
c++中異常的概念和cpu中的異常是不一樣的。除0會觸發cpu異常,然後執行中斷處理程式,發訊號給程序,程序通過呼叫訊號處理程式來處理。只有修改了除數,才能繼續執行下去,否則會一直觸發除0異常。
但是修改除數在c++裡是做不到的,只有通過彙編。
2樓:ggffss
__try
__except
(GetExceptionCode
()==
EXCEPTION_INT_DIVIDE_BY_ZERO?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH)windwos only
3樓:Mr.Sandman
當變數值為: -1.#IND000000000000 時,就是變數 (NAN)Not-A-Number(非數字)
當變數值為: -1.#INF000000000000 時,就是變數 (INF)Infinite(無窮大)
Windows中,使用_isnan判斷NaN情況;使用!_isnan && !_finite判斷INF情況;使用!_finite判斷NaN和INF兩種情況
//0/0的情況下或得到NAN,非零除以零會得到INF
double
spread
=0.0
;spread
/=0.0;if
(_isnan
(spread
))if(!
_isnan
(spread)&&
!_finite
(spread
))if(!
_finite
(spread
))依據以下特性也可自己實現判斷:
1. NaN是唯一與自身不等的浮點數型別,所以IsNan可以用 x != x來判斷。
Anything compared with NAN is false, so NAN == NAN is false.
2. INF階碼全1,尾數全0
intisNaN
(doublex)
#define _INF_DEFINE 1.0/0.0
intisInf
(doublen)
return
memcmp(&
n,&pinf
,sizeof(n
))==0||
memcmp(&
n,&ninf
,sizeof(n
))==0;}
4樓:Milo Yip
浮點數的話,在 C++11 可使用 std::fetestexcept,但這個「異常」不是指C++那套 try-catch 異常的東西。
一般情況下,如果想要 throw exception,還是在除法前自行檢測然後 throw。
5樓:孤狐無悔
標準做法是,
首先判斷除數是否為零,如果不是則繼續運算。
如果除數是0,且是合法輸入,那麼必定有約定好的輸出,或約定好沒有輸出。
如果是非法輸入,則輸出錯誤資訊,或丟擲異常,或其他約定好的錯誤處理方式。
不應過度依賴異常處理。
c++本身並不會丟擲除零異常,所以必須手動檢查之後手動丟擲異常(如果需要的話)。如果要丟擲異常,可以丟擲invalid_argument,或者自定義異常。
6樓:吶吶啵
除0會觸發硬體異常,這個異常是由作業系統捕捉的。以linux為例,可以註冊相關的signal處理函式,並在其中手動丟擲異常。
補充:還需要配合sigsetjump和siglongjmp來實現。先在try入口處sigsetjump,然後在異常函式內使用siglongjump跳回,並在跳回分支內throw自定義除0異常。
關於c語言的malloc 0xffffffff 的乙個問題???
千年放浪 如 李洋 所說,我在64位機上看到的語法樹解析完的結果如下 sizeof size t 是8。1其實轉換成了 1ull。 malloc的引數是無符號整數size t型別,所以你用0xffffffff做引數,就會預設是正整數,而 1做引數,就會導致錯誤。還有,malloc返回值要顯式轉化,不...
如圖,怎麼用二項式定理證明0的n次方等於0
笨小孩 簡單!當你寫完如下示意的所有步驟時,你就成功地用二項式定理證明了0的n 正整數 次方等於0了 第1步 0 1 1 1 1 1 1 0 第2步 0 2 1 1 2 1 2 1 0 第3步 0 3 1 1 3 1 3 3 1 0 第4步 0 4 1 1 4 1 4 6 4 1 0 第5步 第6步...
C語言,講通過指標引用多維陣列時,講到的a 0 與 (a 0)等價怎麼理解?
位址偏移有什麼難以理解的其實還有0 a a 0 a 0 奇怪的0 a 好像是在 c與指標的書裡有詳細說過 a如果是個陣列的話,單獨使用a這個識別符號代表a的首位址。然後如果是a 0 這樣的寫法,代表引用a陣列的下標為0的元素,也就是取a陣列第乙個元素的值。這個下標為0的元素的位址實際上跟整個陣列a的...