[英]Order of logical OR execution in C
想知道下一個語句是否會導致保護錯誤和其他可怕的東西,如果next的值為NULL(節點是鏈表)。
if (!node->next || node->next->some_field != some_value) {
我假設一旦第一部分為真,則不評估OR的第二部分。 假設這個我錯了嗎? 這個編譯器是否具體?
在ISO-IEC-9899-1999標准(C99)中,第6.5.14節:
|| 如果操作數的任何一個比較不等於0,則運算符應該為1; 否則,它產生0.結果類型為int。 4與按位|不同 運算符,|| 運營商保證從左到右的評估; 在評估第一個操作數后有一個序列點。 如果第一個操作數比較不等於0,則不計算第二個操作數。
這不是特定於編譯器的。 如果node->next
為NULL
,則永遠不會評估其余條件。
在OR中,
if ( expr_1 || expr_2)
expr_2只在expr_1失敗時被'測試'(為假)
在一個AND
if( expr_1 && expr_2 )
expr_2僅在expr_1成功時被“測試”(為真)
如果左側的計算結果為true,則可以安全地假設不會計算右側布爾表達式。 查看相關問題 。
它不是特定於編譯器的。 您可以放心地依賴短路,您的代碼將按預期工作。
你是對的。
它是compiler independent
,總是在first
條件之前OR
運算符( !node->next
)評價之前被評估second
條件( node->next->some_field != some_value
之后) OR
運算符。 如果第first
條件為true
,則整個expression
僅在不評估second
條件的情況下求值為true
。
您只是在linked list
充分利用此功能。 只有當它not NULL
您才會進一步訪問next
指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.