printf函数中表达式的评估

Ava*_*mar -3 c compiler-optimization

请看下面的代码

#include<stdio.h>
int main(void){
  int *ptr,a,b;
  a = ptr;
  b = ptr + 1;
  printf("the value of a,b is %d and %d respectively\n",a,b);


  printf("the value of a is %d \n",(ptr));

  printf("the value of b is %d \n",(ptr+1));

    printf("the value  of (ptr+1)-ptr is %d \n",(ptr+1)-ptr);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

the value of a,b is 0 and 4 respectively
the value of a is 0 
the value of b is 4 
the value  of (ptr+1)-ptr is 1 
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么(ptr + 1)-ptr的值为1而不是4为4-0?是否是由于计算优化?

use*_*738 5

首先,你所做的是错的.如果指针算法指向同一数组对象的元素或指向数组对象的最后一个元素的指针,则指针算法有效.所以它是未定义的行为.

在你的情况下,减法返回一个多远是从其他-基于对象的类型指出,这是int在这里,而且sizeof int4字节,它返回1表示的1 int分离.(意思相同4字节-如从的值来推断ab).

从§6.5.69C11标准(这指出了上述两点)

当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标差异......

并且您正在使用%d格式说明符打印地址.您应该使用%p带有参数的格式说明符void*.并且从不考虑取消引用这些指针,因为它将是未定义的行为.