关于*(p--) = *(p-1)的拆分

docker_007 2020-04-07 12:03:27
如题,p为char*型的指针
我的理解是
*(p--) = *(p-1)
的效果等同于

*p = *(p-1);
p--;

可是我调试了一下发现*(p--) = *(p-1)的效果跟

char* pt = p;
p--;
*pt = *(p-1);

是一样的。有知道的可以解释一下吗?谢谢了。
...全文
222 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
docker_007 2020-04-07
  • 打赏
  • 举报
回复
引用 1 楼 真相重于对错 的回复:
你是要从后往前计算吗?请贴出全部代码?
代码不是我写的,不要骂我,我也不知道他想干啥。 只是我打断点跟进到*(p--) = *(p-1)这一行的时候, 发现结果跟自己想像的不太一样,有点不明白。

#include <stdio.h>

void fun(char* p, char value)
{
	while (*p != '\0')
	{
		p++;
	}
	p--;
	while (*(p + 1) < value)
	{
		*(p--) = *(p - 1);
		*(p--) = value;
	}

	printf("%s", p);
}

int main()
{
	char p[] = "54679", value = '3';
	fun(p, value);
	return 0;
}
docker_007 2020-04-07
  • 打赏
  • 举报
回复
引用 2 楼 qybao 的回复:
这个要看编译器的,因为语句本身语义有歧义 如果是=左边先运算,那就是你说的后者的情况,即先=左边p--,再把=右边的*(p-1)赋给*p。 如果是=右边先运算,就是先=右边的*(p-1)赋给*p,再=左边p-- 好像c++15以后统一等号右边优先运算
是的,我试了一下, 使用GNU gcc编译器编译的情况是: 先=左边p--,再把=右边的*(p-1)赋给*p; 而使用MSVC++ 15.0(VS2017)编译器的情况是: 先=右边的*(p-1)赋给*p,再=左边p--
qybao 2020-04-07
  • 打赏
  • 举报
回复
或许可以用逗号表达式测试一下编译器对 表达式=表达式 处理的优先级
int main() {
int a[]={1,2,3};
int *p = &a[2];
printf("%p\n", p);
(printf("左:%p,%d\n", p, *p), *(p--)) = (printf("右:%p,%d\n", (p-1), *(p-1)), *(p-1));
printf("%p,%d,%d\n", p, *p, *(p+1));
return 0;
}

qybao 2020-04-07
  • 打赏
  • 举报
回复
这个要看编译器的,因为语句本身语义有歧义 如果是=左边先运算,那就是你说的后者的情况,即先=左边p--,再把=右边的*(p-1)赋给*p。 如果是=右边先运算,就是先=右边的*(p-1)赋给*p,再=左边p-- 好像c++15以后统一等号右边优先运算
真相重于对错 2020-04-07
  • 打赏
  • 举报
回复
你是要从后往前计算吗?请贴出全部代码?
自信男孩 2020-04-07
  • 打赏
  • 举报
回复
引用 7 楼 docker_007 的回复:
[quote=引用 6 楼 自信男孩 的回复:]
p--;
*pt = *(p-1);

你没发现p-1的p已经是p--之后的p了吗?


我当然知道啊,这段代码本来就是我拿来举例说明问题的。我晕[/quote]
知道,为啥还要提问呢?没明白你要提什么问题。
docker_007 2020-04-07
  • 打赏
  • 举报
回复
引用 6 楼 自信男孩 的回复:
p--;
*pt = *(p-1);
你没发现p-1的p已经是p--之后的p了吗?
我当然知道啊,这段代码本来就是我拿来举例说明问题的。我晕
自信男孩 2020-04-07
  • 打赏
  • 举报
回复
p--;
*pt = *(p-1);

你没发现p-1的p已经是p--之后的p了吗?

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧