我是指针概念的新手..我不明白以下程序..请告诉我这个程序的逻辑..
function (int *p,int *q){
return(*p = (*p + *q) - (*q = *p));
}
int main(){
int y = 15, z = 25;
function(&y, &z);
printf("%d\t%d", z, y);
}
Run Code Online (Sandbox Code Playgroud)
该程序调用未定义的行为.它既修改又使用*q没有序列点的值.
C99标准,第6.5节,第2段:
在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算来修改一次.此外,先前的值应该只读以确定要存储的值.
*q在子表达式中读取(*p + *q),并且不会这样做以确定要存储在子表达式中的值(*q = *p).
意图似乎是交换指向的两个值,但也存在一个完全合理的替代解释:(*q = *p)先评估,然后(*p + *q)(*p + *p由于分配,这将等于).这将导致*p被分配*p + *p - *p或仅仅被分配*p.结果,z将被赋予y(15)的值,而y将保持为15.
我必须强调,因为这是未定义的,你的编译器可以做任何它想做的事情,而不仅仅局限于这种解释或交换两者.