为什么++ * ++ ++的工作,而++我++不工作?

假设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),而不是一个指针。 那么为什么差异呢?

Solutions Collecting From Web of "为什么++ * ++ ++的工作,而++我++不工作?"

后增加的结果是一个右值。 你不能修改它。 ++i++试图修改那个编译器拒绝的右值。

p ++产生一个右值,但它是指针类型。 你不能修改它,但你可以解除引用。 *p++解引用右值。 作为一个值,这给了你指向它的价值。 然后预增量修改它指向的左值,而不是后增量产生的右值。

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

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

底线:在这种情况下,编译器主要是试图保护你自己,尽管如果你足够努力,你仍然可以在脚下自己射击。

++i++分解如下:

 i++ ++(result) 

问题: i++返回一个右值,即一个“临时”值,不可递增。 这是因为i++在递增之前返回i