根據語言的不同,斷言行爲會有所不同。在C語言中,它們經常被錯誤地使用,不正確的用法很常見,許多人建議不要使用它們。它們不應該用於生產(即,C的生產編譯應該爲預處理器定義NDEBUG
),因爲它們僅用於減慢執行速度。
斷言的目的是聲明一個邏輯必要性,而不是檢查結果。例如,它是正確的(C語言)來寫:
f = malloc(s);
if(f == NULL) {
...; exit(1);
}
assert(f != NULL); # This is logically necessary.
但是完全錯誤永遠寫:
f = malloc(x); # THIS IS AN EXAMPLE OF INCORRECT USAGE
assert(f != NULL); # DO NOT DO THIS
這是真正有用的,因爲它是完全有效的寫:
f = xmalloc(x);
assert(f != NULL);
這對讀者來說是一個文檔,xmalloc的定義方式是永不返回空值。
它們通常用於在函數的開始:
void f(void *p) { assert(p != NULL); ... }
這種用法是不一個錯誤檢查。而是用來表示函數f
期望它永遠不會傳遞空指針。這是向開發人員傳遞空指針f
的文檔是編程錯誤。使它成爲斷言可以在啓用斷言時在運行時檢測到錯誤。
我猜在使用斷言時,C和Java有一些差異。它也在該文檔頁面中說過「不要在公共方法中使用斷言進行參數檢查」。 – 2013-02-20 17:07:14