簡體   English   中英

C中邏輯OR執行的順序

[英]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->nextNULL ,則永遠不會評估其余條件。

在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM