f22*_*222 4 c++ undefined-behavior c++17
在代码库重构期间,我发现了这样的代码:
void myFunction (std::map<int, int> my_map)
{
int linked_element;
if (my_map[linked_element = firstIndex] != 0
|| my_map[linked_element = secondIndex] != 0)
{
// do some stuff with linked_element
}
}
Run Code Online (Sandbox Code Playgroud)
或者
void myFunction (std::set<int> my_set)
{
int linked_element;
if (my_set.find(linked_element = firstIndex) != my_set.end()
|| my_set.find(linked_element = secondIndex) != my_set.end())
{
// do some stuff with linked_element
}
}
Run Code Online (Sandbox Code Playgroud)
据我了解,这样做的目的是避免检查两次(第一次是在输入 if 时,第二次是在分配变量时)。我可以理解,根据||true linked_element 的哪一侧将被分配给正确的值,但这对我来说仍然感觉有点不好。
这种行为有定义吗?
这种行为是由评估顺序明确定义的。
首先,linked_element = firstIndex分配发生。该表达式返回 的值,然后将其用作下标运算符(即)firstIndex的参数。根据条件检查该表达式的返回值。如果为真,则由于短路逻辑,不会评估运算符的另一侧。如果是假的,同样的故事也会发生在操作员的另一边。my_mapmy_map[linked_element = firstIndex]!= 0||
不过,以这种风格编写代码是否是一个好的做法是另一个问题。就我个人而言,我会优先考虑可读性和可维护性,而不是这种微优化,除非它是程序的超级关键部分,但我想这是一个意见问题。