我几乎从不把一个++或 - 除了自己的行以外的任何地方。我知道他们可能会导致未定义的行为,并且可能是调试的地狱。但出于冗长目的,我很受诱惑。这是有效的代码吗?
map<int, int> dict;
...
int key = ...;
if (dict.lower_bound(key) != dict.begin()) {
int prevval = (--dict.lower_bound(key))->second;
...
}
我喜欢来做
int prevval = (dict.lower_bound(key)-1)->second;
但是双向迭代器没有定义operator-()
。
谢谢!
答案 0 :(得分:2)
是的,它完全有效并按预期工作。
使用这些运算符时的未定义行为通常来自在序列点之间多次修改变量,这不是您的情况。
答案 1 :(得分:1)
实际上你正在进行初始化而不是分配,但这并没有改变任何东西。
但是,您的代码有效,因为没有选择应用所有运算符的顺序。如果表达式可以在子表达式中拆分,可以按任意顺序进行求值,则必须小心。