2015-05-01 106 views
3

受當前最受歡迎的question concerning getting the larger of two values in C#頂級答案的啓發。比較兩個整數值指向

考慮接受兩個整數指針並返回一個指針的函數。這兩個指針可能是nullptr

const int* max(const int* a, const int* b); 

如果a或b是nullptr則返回非空指針。如果兩者都是nullptr,則返回nullptr

如果兩個都是有效指針返回max(*a, *b);

當前最upvoted答案爲C#問題是

int? c = a > b ? a ?? b : b ?? a; 

詮釋?表示可空值,與指針不同。

這是如何在C++中以優雅和慣用的方式表達的?

我立即嘗試是沿着

const int* maxp(const int* a, const int* b){ 
    if (!a) return b; 
    if (!b) return a; 
    return &std::max(*a, *b); 
} 
+4

這裏暫時沒有問題,'std :: max'返回對更大元素的引用。我認爲你的代碼大大優於任何不可讀的操作符。 –

+2

'std :: optional '是(將會)更好地匹配'Nullable ',它支持相同的事情。 'auto c = b chris

回答

2

三元運算符的誘惑線大

const int* maxp(const int *a, const int *b) { 
    return a? (b? &std::max(*a, *b) : a) : b; 
} 

,但它是因爲它很有趣,不是因爲它的好。

問題中的代碼更具可讀性。

+0

我其實覺得這很可讀(沒有括號可能有點混淆)。 – juanchopanza

-2

你的代碼存在問題,即它返回一個指向std :: max輸出的指針。考慮到功能輸出的地址通常是越野車,並且總是味道不好。只有當函數返回一個變量的引用時纔是正確的,只要指針被保持,該變量將一直保持。

我會用一個簡單的if語句代替你的函數的最後一行:

if (*a > *b) return a; 
else return b; 

這樣,你總是會返回被輸入到你的函數指針之一。

P.S.我瀏覽了關於std::max的標準,並且很難理解它。但最終,即使你的代碼確實有效(因爲std::max返回一個引用),最好不要取所述引用的地址。

P.P.S.在這裏,避免使用三元運算符是最好的。其餘的功能很好。