无法理解错误条件和左值

时间:2014-06-28 21:21:03

标签: 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;
}

我在STATEMENT 3中收到错误

  

[错误]左撇子需要作为一元'&amp;'操作数

我期待STATEMENT 1&amp;的输出。 3与两个地址相同是相同的。

我还期望STATEMENT 2的输出为5&amp;声明4为6。

我抬起头,发现了一个类似的问题:Lvalue required error

我理解了这个问题的问题。从评论到上面提到的问题的第一个答案,我认为左值是可以存储某些东西的东西。

但我仍然无法理解为什么&amp;(a ++)或&amp;(++ a)应该给出错误。 任何帮助将不胜感激。

感谢您阅读本文。

[编辑] 感谢您的回答。如果可能的话,请包括参考,其中讨论了这些表达的确切执行顺序或性质。 这样,像我这样的新手不会因为这些微不足道的问题而困扰社区。

3 个答案:

答案 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 ++会返回一个临时,其值为增量之前的值。你不能把临时的地址拿出来,因为它会在表达结束时死掉(因此在你设法对它做任何事情之前)。