2016-01-01 42 views
8

最近我意識到,你可以使用GCC和鐺三元運營商沒有中間(?:? :作品),它會插入第一個表達式到中:沒有中間表達三元操作符

// outputs 2 
cout << (2 ?: 4); 
// outputs 3 
cout << (0 ? : 3); 

標準在哪裏?我看了看,並沒有看到任何關於它的事情。

+0

它不會將第一個表達式插入到中間。它使用中間第一個表達式的_result_。所以如果第一個表達式是一個函數,那麼該函數不會執行兩次。 – ldanilek

回答

10

它完全不在標準

你所觀察是一個GCC擴展:https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html

如果你忽略它,它的值從第一個操作數之前,上下文轉換採取bool
擴展的價值在於不重複副作用並減少源代碼的大小。

+1

這就是我想感謝。當然,它在叮噹中也是有意義的。 – Czipperz

+1

擁有僅適用於GCC/Clang的C++代碼是一個好主意嗎? – Ilya

+0

@Ilya在合理的情況下編寫乾淨而便攜的代碼是一個不錯的主意,不會花費太多精力或無法接受地損害您的性能。總之,幾乎從不。 – Deduplicator