2014-10-05 22 views
0

我試圖檢查得分和輸出誰贏過。黑色> 0,白色< 0,並且匹配是== 0.我應該怎麼做,看看GetValue(board)== 0沒有再次調用我的函數或使用其他變量?輸出得分只有一個函數調用

GetValue(board) > 0 ? cout << "Black wins" : cout << "White wins"; 
+3

使用一個變量,並採取BWG的代碼...這是一個愚蠢的約束,讓你不這樣做。 – Dici 2014-10-05 23:51:43

+1

如果返回值僅爲-1,0和1,則可以使用switch語句。請注意,不使用本地變量不會獲得性能。 – 2014-10-05 23:59:15

+0

使用單個呼叫非常重要嗎? – saadtaame 2014-10-06 00:13:14

回答

2

爲什麼你不想使用一個變量?如果你這樣做,你可以使用複合三元運算符:

int val = GetValue(board); 
cout << val == 0 ? "Tie" : (val < 0 ? "White wins" : "Black wins"); 

編輯:但是這不是一條線,是嗎?真正的一行,禮貌的lambda功能。
它還假定GetValue返回一個int。並且爲了簡明起見,需要using namespace std

cout << vector<string>({"White wins", "Tie", "Black Wins"})[([](int x){return(0<x)-(x<0)+1;}(GetValue(board)))]; 

如果你想輸出一個功能的分數叫你可以這樣做(而且不實際使用)

+0

這絕對是一個聰明的單線!但是我不會在實踐中推薦它,不僅僅是爲了可讀性,而且它每次都會分配新的字符串。一個const char *的std ::數組可能會更好。 – 2014-10-06 00:43:19

+0

@BWG哈哈我不知道C++中lambda表達式的語法,但是從你有函數式編程的那一刻開始,你試圖用單一行來做任何事情,即使它不總是好的,我也會在Scala中做同樣的事情爲了可讀性。 – Dici 2014-10-06 10:24:38

1

cout << msg[ GetValue(board) + 1] << endl; 

其中:

msg[0] = "White Wins"; 
msg[1] = "Tie"; 
msg[2] = "Black Wins"; 

這假定GetValue返回-1,0或1;

+1

我寧願在這種情況下使用switch語句。不用擔心GetValue是否返回錯誤的值。 – 2014-10-06 00:08:50

+1

@NeilKirk我同意,他可以做'簽署(GetValue(板))',所以它「夾」到-1/0/1 – BWG 2014-10-06 00:10:21

+0

我同意。我不知道OP爲什麼需要一個函數調用:D – saadtaame 2014-10-06 00:12:24

1
std::string win_message(int const &x) 
{ 
    if (x == 0) return "Tie"; 
    if (x < 0) return "Black wins"; 
    return "White wins"; 
} 

// ... 

    cout << win_message(GetValue(board)); 
+0

注意:'x'是一個引用,而不是一個變量 – 2014-10-06 00:44:00

+0

爲什麼你要把它作爲參考? – 2014-10-06 00:45:20

+0

@NeilKirk他指定不使用變量 – 2014-10-06 00:45:33

相關問題