无法理解C ++中预增量/预减量的工作

时间:2017-07-03 08:12:31

标签: c++ operators pre-increment

有人可以解释以下代码中发生的事情吗? (取自GeeksForGeeks)

int main(){
 int a = 10;
 ++a = 20; // works
 printf("a = %d", a);
 getchar();
 return 0;
}

执行语句++ a = 20时究竟发生了什么?另外,请澄清为什么此代码执行失败?

int main(){
    int a = 10;
    a++ = 20; // error 
    printf("a = %d", a);
    getchar();
    return 0;
 }

代码来自:http://www.geeksforgeeks.org/g-fact-40/

4 个答案:

答案 0 :(得分:8)

当你这样做时

++a = 20;

大致相当于

a = a + 1;
a = 20;

但是当你做的时候

a++ = 20;

大致等同于

int temp = a;
a = a + 1;
temp = 20;

但是变量temp并不存在。 a++的结果称为 rvalue ,无法分配。 Rvalues应该位于任务的右侧,而不是左侧。 (这基本上是lrlvaluervalue的来源。)

参见例如this values category reference有关左值和左值的更多信息。

答案 1 :(得分:1)

这是r和l值之间的差异。如果您已经使用gcc编译了第二个代码片段,您会看到:

  

左值作为赋值的左操作数

意思是,a++是rvalue而不是左值,因为如果你想为它分配一些东西它应该是

答案 2 :(得分:1)

int main(){
 int a = 10;
 ++a = 20; // works
 printf("a = %d", a);
 getchar();
 return 0;
}

这是一种c语言。 逐行解释 int main()这一行定义了一个名为main的入口函数,它应该返回一个整数类型(int) int a = 10声明一个变量整数,其值为10; ++ a = 20;此时,在对a执行任何操作之前,您的代码将a的值递增1。 这意味着,a的值增加1,然后a指定值20; .... 语句++ a = 20在某种意义上是一个incorect,a最初是10,并且你将它增加到11。就像说11 = 20;这可能不会引发错误,因为代码行没用。 printf()是一个将文件打印到屏幕的c方法,传递一个字符串" a =%d"告诉编译器将a打印到十进制数(%d)。 getchar()用于终止正在运行的程序,返回0是强制告诉操作系统代码运行成功并返回整数值0。

int main(){
    int a = 10;
    a++ = 20; // error 
    printf("a = %d", a);
    getchar();
    return 0;
 }

这不是a ++ = 20因为,正确的值增量在增加之前执行操作,而不像++ a在执行操作之前增加。 所以这是不可能的,它永远不会起作用,因为a已经是10,你说的是值+分配20,你不能为它赋值,它应该是计算它自己的值值。所以编译器希望解释为变量a ++ = 20,而++不能是可变名称。这就是它永远无法工作的原因。

c中增量和减量的本质是什么....它对于创建条件语句非常有用,例如for循环,而语句等等,例如:

for(int i = 0; i < 4; i++)
{
printf('THis is c-language');
}

int i = 0;
while(i < 4){
printf('THis is c-Language');
i++;
}

因此,遵循编程规则和规则,您不允许为++或++ a分配值 它们是供编译器操作的,所以永远不要为它们赋值。 谢谢。

答案 3 :(得分:0)

赋值运算符的左操作数应该是左值 表达式++a是左值,而a++不是,因此它不能是赋值运算符的左操作数。

n3797-§5.3.3(p1):

  

[...]结果是更新的操作数;这是一个左值[...]