三六九*_*三六九 1 c side-effects undefined-behavior assignment-operator post-increment
当我在寻找表达式v[i++]=i;为什么是定义行为的时候,突然看到了一个解释,因为表达式存在于程序中的两个序列点之间,而c标准规定了在两个序列点中边的出现顺序效果是不确定的,所以程序中运行表达式时,不确定是++先操作运算符还是先操作=运算符。我对此感到困惑。当表达式求值的过程中,不应该先用优先级来判断,然后引入顺序点来判断先执行哪个子表达式吗?我错过了什么吗?
当俄罗斯用户AnT站 这样解释时,是否意味着在程序中编写诸如a[i]=y++;或 之类的代码a[i++]=y;无法确定++操作员和=操作员无法确定谁先运行。
原因v[i++]=i;是未定义的行为是因为变量i是在同一个表达式中读取和写入的,而没有排序。
诸如a[i]=y++和 之类的表达式a[i++]=y不会表现出未定义的行为,因为在不排序的情况下,不会在表达式中读取和写入任何变量。
然而,该=运算符确实确保在分配到左侧的副作用之前完全评估其两个操作数。具体来说,a[i]被评估为指定数组 的第 ia个元素的左值,并被y++评估为的当前值y。