逗號我發現下面的有趣的代碼今天:混亂與三元表達
SomeFunction(some_bool_variable ? 12.f, 50.f : 50.f, 12.f)
我創建一個小樣本重現行爲:
class Vector3f
{
public:
Vector3f(float val)
{
std::cout << "vector constructor: " << val << '\n';
}
};
void SetSize(Vector3f v)
{
std::cout << "SetSize single param\n";
}
void SetSize(float w, float h, float d=0)
{
std::cout << "SetSize multi param: " << w << ", " << h << ", " << d << '\n';
}
int main()
{
SetSize(true ? 12.f, 50.f : 50.f, 12.f);
SetSize(false ? 12.f, 50.f : 50.f, 12.f);
}
結果我從運行上面得到的代碼是:
clang++ -std=c++14 -O2 -Wall -pedantic -lboost_system -lboost_filesystem -pthread main.cpp && ./a.out
main.cpp:29:20: warning: expression result unused [-Wunused-value]
SetSize(true ? 12.f, 50.f : 50.f, 12.f);
^~~~
main.cpp:30:21: warning: expression result unused [-Wunused-value]
SetSize(false ? 12.f, 50.f : 50.f, 12.f);
^~~~
2 warnings generated.
SetSize multi param: 50, 12, 0
SetSize multi param: 50, 12, 0
我期待的這兩個的情況是,一個參數將被傳遞給SetSize(float)
。然而,我發現兩個參數非常混亂(特別是因爲三元的優先級高於逗號;所以我認爲在這種情況下,逗號並不是分隔函數的參數)。例如,如果使用true
,則三元應該導致12.f, 50.f
。在這個表達式中,值的逗號左側被丟棄/忽略不計,所以我期待最終的結果是:
SetSize(50.f);
混亂的第二部分是,我們是否使用true
或false
三元,相同的2個值被傳遞給函數。 true
的情況應該是h=12, w=50
我想......
我看到編譯器試圖警告我一些事情,但我不明白是怎麼回事。有人可以分解這種邏輯,並逐步解釋結果嗎?
您不能使用三元運算符提供參數列表。它只選擇值。 – EJP
@EJP:讓我們用回答部分來回答問題。謝謝。 –
條件運算符的語言語法不允許在最後一部分使用逗號 - 運算符表達式(爲了避免歧義) –