gpt4 book ai didi

c - 为什么++*p++有效而++i++无效?

转载 作者:IT王子 更新时间:2023-10-29 00:47:41 25 4
gpt4 key购买 nike

假设p是一个整数指针,i是一个整数:

*p++ 给出对应于 p一个整数值

i++ 给出递增 1 的整数

既然从行为上看,上面的结果都是整数,++*p++++i++ 不应该报告相同的错误吗?但是为什么 ++*p++ 有效而 ++i++ 给出编译器错误?

int main()
{
int a[10] = {0};

int *p = (int*)&a;
int i = 0;

// printf("%d", ++i++); -- FAILS error: lvalue required as increment operand
printf("%d\n", ++*p++ ); // Prints 1
return 0;
}

编辑

++i++分解如下:

i++
++(result)

这正是我感到困惑的地方:以同样的方式,我们可以将++*p++ 分解为

*p++ 
++(result).

*p++ 返回一个值 (rvalue) ,而不是一个指针。那么为什么不同呢?

最佳答案

后增的结果是一个右值。您无权修改它。 ++i++ 试图修改编译器拒绝的右值。

p++ 产生一个右值,但它是指针类型。您不能修改它,但可以取消引用它。 *p++ 取消引用该右值。这为您提供了它指向的值,作为左值。预增量然后修改它指向的左值,而不是后增量产生的右值。

编辑:我应该再补充一点:即使 ++i++ 被编译器允许,结果将是未定义的行为,因为它试图修改 i 两次,中间没有序列点。在 ++*p++ 的情况下,这也不会发生——后增量修改指针本身,而前增量修改指针指向的内容(在它被递增之前)。由于我们正在修改两个完全不同的位置,因此不会导致未定义的行为。

如果您非常想这样做,您仍然可以通过将指针初始化为指向自身来获得未定义的行为,在这种情况下,两个增量都会尝试修改指针。委员会并没有很努力地阻止这种情况,可能是因为只有真正迂腐的人才有可能想到这种疯狂的事情。

底线:在这种情况下,编译器主要是想保护您免受您自己的伤害,但如果您足够努力,您仍然可以搬起石头砸自己的脚。

关于c - 为什么++*p++有效而++i++无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072407/

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