c编程中的指针

use*_*593 0 c

我是指针概念的新手..我不明白以下程序..请告诉我这个程序的逻辑..

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)

wno*_*ise 7

该程序调用未定义的行为.它既修改又使用*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.

我必须强调,因为这是未定义的,你的编译器可以做任何它想做的事情,而不仅仅局限于这种解释或交换两者.