C 无法理解错误条件wrt左值

C 无法理解错误条件wrt左值,c,compiler-errors,lvalue,C,Compiler Errors,Lvalue,我是一名编程初学者,正在尝试一些组合 #include<stdio.h> int main() { int a=5; printf("%d",&a); // STATEMENT 1 printf("\n%d",a); //STATEMENT 2 printf("\n%d",&(a++)); //STATEMENT 3 printf("\n%d",a); //STATEMENT 4 return 0; } #包括 int main() { INTA=5; p

我是一名编程初学者,正在尝试一些组合

#include<stdio.h>


int main()
{
int a=5;

printf("%d",&a); // STATEMENT 1
printf("\n%d",a); //STATEMENT 2
printf("\n%d",&(a++)); //STATEMENT 3
printf("\n%d",a);  //STATEMENT 4

return 0;
}
#包括
int main()
{
INTA=5;
printf(“%d”,&a);//语句1
printf(“\n%d”,a);//语句2
printf(“\n%d”,&(a++);//语句3
printf(“\n%d”,a);//语句4
返回0;
}
我在语句3中得到一个错误

[错误]一元'&'操作数需要左值

我希望语句1和3的输出是相同的,因为两个地址都是相同的

我还期望语句2的输出为5,语句4的输出为6

我抬头一看,发现了一个类似的问题:

我理解了这个问题中的问题。从对上述问题的第一个答案的评论中,我看到左值是一种可以存储某些东西的东西

但是我仍然不明白为什么&(a++)或&(++a)应该给出一个错误。 任何帮助都将不胜感激

谢谢你阅读这篇文章

[编辑]谢谢您的回答。如有可能,请提供参考资料,其中讨论了执行的确切顺序或此类表达式的性质。
这样,像我这样的新手就不会用这些琐碎的问题来困扰社区。

a++
增加你的
a
并返回
a
的旧值。
&
运算符返回变量的地址。但是返回的
a
旧值没有地址。这是一件非常暂时的事情,不是左撇子。这就是为什么您不能获取它的地址。

a++,您可能知道,它返回一个临时值,值为a,然后再递增。你不能接受一个临时变量的地址,因为它会在表达式结束时消失(因此在你处理它之前)。

a++
++a
&
这三个变量都需要左值来操作,操作时返回右值

所以当你做&(a++)

出于类似原因,您不能执行以下任何操作:

++(a++) : lvalue missing
(++a)++ : lvalue missing
a++++   : lvalue missing
++++a   : lvalue missing

您链接的问题实际上并不相关。这个问题涉及
++
运算符中的左值。在您的情况下,问题在于
操作员。您可以将
a++
替换为
a+1
,将得到相同的错误。并且链接的问题的答案不完全正确。数组是左值。忽略它,它在这里对您没有帮助。
++a
也不是左值。参考文献:6.5.3.1#2说
++a
等同于
a+=1
,6.5.16#3说赋值(简单或复合)的结果不是左值。在C11之前,
a++
++a
具有相同的属性,只是后者的“返回”值是
a+1
。@MattMcNabb oh,所以这就是为什么我在这个问题上的发现是不一致的。编辑。我想你误读了我<代码>++a
在C++11中也不是左值。在C++11中改变的是规则sequencing@MattMcNabb那么这些规则在这里没有改变什么?另一方面,我很难找到有关++a不是左值的原因的信息。请注意,
++a
也不是左值。此外,是否为左值的属性是表达式本身的属性,而不是“返回值”的属性。表达式的计算结果为一个值,可能有副作用。对于
++
(任何一种形式),增量都是一种副作用,评估是
a
a+1
。在这两种情况下,如果语言设计者希望这样做,那么它可能是一个左值,但他们选择了不这样做。(注释:在C++中,增量的结果有时是一个LValk)。使这些表达式非LoWalk的一个很好的理由是,例如“代码> A+++=5的表达式;<代码>给出一个编译器错误(与允许的相反,但会导致未定义的行为doe在没有插入序列点的情况下更新
a
两次)。@MattMcNabb+1提供原因。
++(a++) : lvalue missing
(++a)++ : lvalue missing
a++++   : lvalue missing
++++a   : lvalue missing