【发布时间】:2013-07-02 15:51:48
【问题描述】:
在这个C-FAQ 中给出关于sequence point 的信息;
标准规定:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。此外,只能访问先验值以确定要存储的值。
在例子中
i = i++;
a[i] = i++;
从声明的第一句话可以清楚地看出,这些示例是未定义行为的结果。
在解释该声明的第二句话时,据说;
第二句说:如果在一个完整的表达式中写入一个对象,那么在同一个表达式中对它的任何和所有访问都必须直接参与到要写入的值的计算中。该规则有效地将合法表达限制为那些访问明显先于修改的表达。例如旧的备用
i = i + 1
是允许的,因为 i 的访问用于确定 i 的最终值。例子
a[i] = i++
是不允许的,因为 i 的访问之一(a[i] 中的那个)与最终存储在 i 中的值无关(这在 i++ 中发生),所以没有定义的好方法。
我的问题是;
1.这是什么意思,如果在一个完整的表达式中写入一个对象,那么在同一个表达式中对它的任何和所有访问都必须直接参与到要写入的值的计算中。 ?
2.什么意思,例子a[i] = i++
被禁止,因为 i 的访问之一(a[i] 中的那个)与最终存储在 i 中的值无关(这在 i++ 中发生)
有人可以用一些简单的方式解释一下吗?
【问题讨论】:
标签: c undefined-behavior sequence-points