2012-09-22 35 views
0

無論何時使用短路或(|)以下代碼段錯誤,並且在未短路時完美編譯(||)?爲什麼當我使用|時這個C代碼段錯誤而不是||?

使用gcc -Wall ../IsNull/IsNull.c ../IsEmpty/IsEmpty.c *.c -o IsNullOrEmpty編譯:

#include <stdbool.h> 

#include "../IsNull/IsNull.h" 
#include "../IsEmpty/IsEmpty.h" 

#include "IsNullOrEmpty.h" 

_Bool isNullOrEmpty (char *str); 

_Bool isNullOrEmpty (char *str) { 
    return (isNull (str) | isEmpty (str));  
} /* end of isNullOrEmpty() */ 
+3

'isNULL'的定義是什麼? –

+2

當你*不*短路時,你確定它沒有崩潰嗎?這更有意義。 – oldrinb

+2

'str'在傳入時也可能不爲空,而是指程序不再有權訪問的數據。你有沒有在調試器中加載程序來查看'str'的​​值? – birryree

回答

7

您應該使用||邏輯或操作員),而不是|按位或運營商)。前者短路,而後者做而不是,因此分段故障。

+0

謝謝!問題變得更加清晰。 – chrismsawi

2

按位或(|)不能被短路,因爲它不是布爾表達式的一部分。它只是一個操作(如總和),所以爲了產生結果,每個端點都必須執行,結果實際上是由函數返回的兩個值的每個位or的位。

相關問題