Avatar ·

什么是序列点(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++; ``` 这里我使用一个自身在变化的索引来给数组元素赋值。我不明白会使用哪个索引值——旧的还是新的?为什么这被认为是危险的? 你能