簡體   English   中英

非布爾的短路

[英]Short-circuiting of non-booleans

縮短三元運算符的使用是否安全:

process_ptr(ptr ? ptr : default_ptr);

與短路:

process_ptr(ptr || default_ptr);

在C和C ++? 換句話說,是我們保證得到任何 ptr default_ptr從表達研究背部,或者是它可能允許表達導致任意“邏輯真”值,如果表達式是邏輯真?

這是你在Perl代碼中看到的那種代碼,但我很少在C / C ++中看到它,這是我問題的原始基礎。

第二個表達式將評估為10

引用C11標准草案:

6.5.14邏輯OR運算符

  1. || 如果操作數的任何一個比較不等於0,則運算符應該為1; 否則,它產生0.結果類型為int

所以這兩個表達式是非常不同的,因為其中一個表達式產生指針,另一個表達式產生一個整數。

編輯

其中一條評論聲稱這個答案僅適用於c,並且Orbit中的@Lightness Races是正確的。

還有一些答案只適用於c ++ 1 ,盡管與它們唯一不同的是c ++具有bool類型,然后它將此表達式計算為bool而不是int 顯然有超載的一個重要問題|| c ++中的運算符 ,它可以修復短命令以申請重載它的對象。

所以對於c ++來說還有更多的事情要考慮,但由於這個問題用兩種語言標簽標記,所以至少要提到差異。

當短路應用時,規則仍然適用,即表達式的評估結果對於c為10 ,對於c ++為truefalse


喜歡這些問題的答案: 12

關於Perl風格,通常是類型

do_someting || die("didn't work")

這也適用於C ++。

function_returning_bool(some) || std::cout << "Error!" << std::endl;

這是由於|| 作為邏輯OR運算符,如果返回值為真,則在這種情況下導致短路。

但是使用它而不是三元運算符是不可能的。

std::cout << ("asd" || "dsa");

這將導致輸出1

不。結果類型是int (或C ++中的bool ),並且將是10 (在C ++中為truefalse )。

operator|| 對於指針返回一個bool ,所以ptr || default_ptr 如果ptrdefault_ptr為非null,則ptr || default_ptr將計算為true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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