计算 I+V[i++] 的顺序是什么?
what is the order of calculating i+v[i++]
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v{1,2,3,4,5};
int i = 0;
while (i < 5) {
cout << i+v[i++] << endl;
}
return 0;
}
为什么程序的输出是"2,4,6,8,10",而不是"1,3,5,7,9"?
这是未定义的行为,因为"第一个"i
和其他i++
的读取是未排序的。输出毫无意义。
延伸阅读:未定义的行为和序列点,
一些编译器会警告您,您正在执行导致未定义行为的操作:依赖于未排序表达式的求值顺序。
例:
<source>:22:22: warning: unsequenced modification and access to 'i' [-Wunsequenced] cout << i+v[i++] << endl;
未定义序列点之间表达式的求值顺序。表达式i+v[i++]
中唯一的序列点位于表达式的末尾,因此编译器可以根据需要自由排序i
的添加和i
的增量。
相关文章:
- 计算 I+V[i++] 的顺序是什么?
- C++:使用方法调用析构函数的顺序是什么?
- 函数模板实例化、替换和重载解析的顺序是什么?
- 在 OpenGL 中计算矩阵时,转换的正确顺序是什么?
- 正确的包含顺序是什么
- 抛出多个异常时,catch 块执行的顺序是什么,为什么?
- 编译器在遇到提取或插入运算符时处理信息(字符串、操纵器等)的顺序是什么?
- 在C++中为临时库调用析构函数的顺序是什么
- 操作员优先c |进行计算的确切顺序是什么
- 在虚拟继承中构造函数调用的顺序是什么
- 函数参数的销毁顺序是什么
- 函数参数的销毁顺序是什么
- 通过构造函数初始化集初始化的变量的销毁顺序是什么
- 基类的销毁顺序是什么
- openGL:使用glm进行转换的顺序是什么
- 在C++中,析构函数的调用顺序和成员变量的销毁顺序是什么
- 类成员中的初始化顺序是什么
- 类中成员的最佳顺序是什么
- JUCE原子设施的记忆顺序是什么?
- if括号if(..)中语句的求值顺序是什么