我是编程的初学者,正在尝试一些组合。
#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;
}
我在STATEMENT 3中收到错误
[错误]左撇子需要作为一元'&amp;'操作数
我期待STATEMENT 1&amp;的输出。 3与两个地址相同是相同的。
我还期望STATEMENT 2的输出为5&amp;声明4为6。
我抬起头,发现了一个类似的问题:Lvalue required error
我理解了这个问题的问题。从评论到上面提到的问题的第一个答案,我认为左值是可以存储某些东西的东西。
但我仍然无法理解为什么&amp;(a ++)或&amp;(++ a)应该给出错误。 任何帮助将不胜感激。
感谢您阅读本文。
[编辑] 感谢您的回答。如果可能的话,请包括参考,其中讨论了这些表达的确切执行顺序或性质。 这样,像我这样的新手不会因为这些微不足道的问题而困扰社区。 p>
答案 0 :(得分:6)
a++
会递增a
并返回旧值a
。 &
运算符返回变量的地址。但是a
的返回旧值没有地址。这是一个非常临时的事情,而不是左值。这就是为什么你不能拿它的地址。
答案 1 :(得分:2)
a++
以及++a
和&
所有这三个都需要左值来操作,操作时它们会返回右值
所以当你做&amp;(a ++)
时First, (a++) is performed -> a is taken as lvalue and (a++) returns rvalue
Second, &(a++) is performed -> a++ returns rvalue but & needs lvalue so lvalue is
missing,therefore an error.
出于类似的原因,您无法执行以下任何操作:
++(a++) : lvalue missing
(++a)++ : lvalue missing
a++++ : lvalue missing
++++a : lvalue missing
答案 2 :(得分:1)
a ++会返回一个临时,其值为增量之前的值。你不能把临时的地址拿出来,因为它会在表达结束时死掉(因此在你设法对它做任何事情之前)。