gpt4 book ai didi

c - printf 函数中表达式的求值

转载 作者:行者123 更新时间:2023-11-30 20:45:44 25 4
gpt4 key购买 nike

请看下面的代码

#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;
}

输出:

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

我不明白为什么(ptr+1)-ptr的值为1而不是4作为4-0?是由于计算优化吗?

最佳答案

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

在你的例子中,减法返回一个与另一个的距离 - 基于指向的对象的类型,这里是int,以及 sizeof int4 字节,它返回 1 表示 1 int 分隔。 (含义与 4 字节相同 - 可以从 ab 的值推断出)。

来自§6.5.6¶9 C11标准(这指出了上述两点)

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements...

并且您正在使用 %d 格式说明符打印地址。您应该使用 %p 格式说明符和参数 void* 进行强制转换。并且永远不要考虑取消引用这些指针,因为这样做将是未定义的行为。

关于c - printf 函数中表达式的求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49052904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com