逗号我发现下面的有趣的代码今天:混乱与三元表达
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:让我们用回答部分来回答问题。谢谢。 –
条件运算符的语言语法不允许在最后一部分使用逗号 - 运算符表达式(为了避免歧义) –