C ++中的增量和三元运算符优先级

时间:2018-07-11 10:19:51

标签: c++ iterator operator-precedence

我想打印用分号分隔的向量元素。 下面的代码片段产生一个奇怪的结果:结果以向量的第二个元素开始。有人可以写说明吗?在这种情况下,迭代器何时递增?

#include <iostream>
int main() {
    vector<int> v(10);
    for ( int i = 0; i < 10; ++i ) {
        v[i] = i;
    }

    for ( auto it = v.begin(); it != v.end(); )
        std::cout << *it << ( (++it != v.end() ) ? ";" : "" );
}

2 个答案:

答案 0 :(得分:3)

Generally

  

几乎所有C ++运算符的操作数求值顺序(包括函数调用表达式中的函数自变量的求值顺序以及任何表达式中子表达式的求值顺序)都没有指定。

自C ++ 17起,有一个特殊的移位规则:

  

在移位运算符表达式E1<<E2E1>>E2中,E1的每个值计算和副作用在E2的每个值计算和副作用之前被排序。 / p>

答案 1 :(得分:2)

在C ++ 17之前,未指定* it和++ it的携带顺序。参见例如https://en.cppreference.com/w/cpp/language/eval_order

可以在一个更简单的示例中看到

#include <iostream>

int main() {
    int i = 3;
    std::cout << i << ++i;
}

我的编译器(带有-Wall选项的Apple LLVM)报告的位置

warning: unsequenced modification and access to 'i' [-Wunsequenced]
    std::cout << i << ++i;
                 ~    ^