无法理解错误条件和左值

kry*_*ght 2 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;
}
Run Code Online (Sandbox Code Playgroud)

我在STATEMENT 3中说错了

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

我期望STATEMENT 1和3的输出相同,因为两个地址都是相同的.

我还期望STATEMENT 2的输出为5&STATEMENT 4为6.

我抬起头,发现了一个类似的问题:Lvalue需要错误

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

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

谢谢您阅读此篇.

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

Lum*_*mpN 6

a++递增你的a并返回a.该&运算符返回一个变量的地址.但返回的a没有地址.这是一个非常临时的事情,而不是左值.这就是为什么你不能拿它的地址.

  • 使这些表达式成为非左值的一个很好的理由是像'a ++ = 5;`这样的表达式给出了一个编译器错误(而不是被允许,但是在没有插入序列点的情况下,无声地导致未定义的行为更新'a`两次) . (2认同)