首先评估表达式的哪一侧?

时间:2010-09-19 22:28:57

标签: c operator-precedence

表达式的右侧会先评估还是左侧?

void main ()
{
    int i = 0 , a[3] ;
    a[i] = i++;
    printf ("%d",a[i]) ;
}

2 个答案:

答案 0 :(得分:16)

未指定赋值运算符的操作数的评估顺序:可以按任何顺序计算操作数。

但是,此表达式(a[i] = i++)会产生未定义的行为,因为您同时修改i(使用i++)并单独阅读i(使用a[i] )这些行动之间没有序列点。

答案 1 :(得分:3)

C没有定义首先评估哪一方。标准状态(C99§6.5/ 2):

  

在前一个和下一个序列之间   指向一个物体应该存储它   最多修改一次的值   表达的评价。   此外,先前的值应为   只访问以确定值   存储

您发布的上述结果因此是UB。