什么是序列点(sequence points)以及它们如何与C++中的未定义行为相关联?
大家好!我是一名C++初学者,最近遇到了“序列点”(sequence points)的概念。在很多论坛上看到,违反序列点规则会导致未定义行为(undefined behavior),但我不太明白这在实际中意味着什么。
下面是一个让我困惑的简单例子:
```cpp
int i = 0;
int result = i++ + i++;
```
我在某处读到这样的代码会引发未定义行为。但为什么呢?乍一看,结果似乎是可预测的:先取 `i` 的旧值(0),然后递增,重复两次。我本以为 `result` 会是 `0 + 1 = 1`,而 `i` 变成 `2`。但编译器说这是UB。
另一个例子:
```cpp
int arr[5] = {0};
int i = 0;
arr[i] = i++;
```
这里我使用一个自身在变化的索引来给数组元素赋值。我不明白会使用哪个索引值——旧的还是新的?为什么这被认为是危险的?
你能