C++ c+中的增量和三元运算符优先级+;
我想打印用分号分隔的向量元素。 下面的代码段产生了一个奇怪的结果:结果从向量的第二个元素开始。有人能解释一下吗?在这种情况下,迭代器何时递增C++ c+中的增量和三元运算符优先级+;,c++,iterator,operator-precedence,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();
#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() ) ? ";" : "" );
}
#包括
int main(){
向量v(10);
对于(int i=0;i<10;++i){
v[i]=i;
}
对于(自动it=v.begin();it!=v.end();)
std::cout在C++17之前,未指定*it和++it的携带顺序。请参阅,例如
这可以在一个简单的例子中看到
#include <iostream>
int main() {
int i = 3;
std::cout << i << ++i;
}
:
几乎所有C++操作符的操作数的顺序(包括函数调用表达式中函数参数的求值顺序和表达式中的子表达式的求值顺序)未指定。< /P>
自C++17以来,轮班有一个特殊规则:
在移位运算符表达式E1E2
中,E1
的每个值计算和副作用在E2
的每个值计算和副作用之前排序
这应该在GCC 7上实现,它实现了C++ 17标准,这将是非常棒的。不幸的是,我不能影响我们的基础结构。如果你读了你所给的链接,你会发现这个序列是未指定的,而不是(在C++标准中)。与未定义相同。此外,在本例中,C++17中的情况发生了变化:在类似cout@Peter:You's right的表达式中,我的意思是未指定,但不知道C++17的变化。感谢您的参考。顺便说一句,gcc表示以下警告:警告:“I”上的操作可能未定义[-Wsequence point]如果向量迭代器是指针的typedef,那么它很可能是未定义的
warning: unsequenced modification and access to 'i' [-Wunsequenced]
std::cout << i << ++i;
~ ^