📜  C++中的预递增(或递减)

📅  最后修改于: 2021-05-26 02:49:45             🧑  作者: Mango

在C++中,可以将前递增(或前递减)用作l值,但不能将后递增(或后递减)用作l值。

例如,以下程序打印a = 20 (++ a用作l值)

// CPP program to illustrate
// Pre-increment (or pre-decrement)
#include 
  
int main()
{
    int a = 10;
  
    ++a = 20; // works
  
    printf("a = %d", a);
    getchar();
    return 0;
}
a = 20

上面的程序有效,而下面的程序编译失败,错误为“赋值中的非左值” (a ++用作左值)

// CPP program to illustrate
// Post-increment (or post-decrement)
#include 
  
int main()
{
    int a = 10;
    a++ = 20; // error
    printf("a = %d", a);
    getchar();
    return 0;
}
prog.cpp: In function 'int main()':
prog.cpp:6:5: error: lvalue required as left operand of assignment
 a++ = 20; // error 
     ^

++ a与a ++作为左值有何不同?

这是因为++a返回一个lvalue ,它基本上是对我们可以进一步分配给该变量的引用-就像普通变量一样。也可以将其分配给参考,如下所示:

int &ref = ++a; // valid
int &ref = a++; // invalid

而如果您回想起a++工作原理,它并不会立即增加其持有的价值。为简便起见,您可以将其视为在下一条语句中递增。因此,基本上发生的是a++返回一个rvalue ,它基本上只是一个值,类似于未存储的表达式的值。您可以想到a++ = 20;处理后如下:

int a = 10;

// On compilation, a++ is replaced by the value of a which is an rvalue:
10 = 20; // Invalid

// Value of a is incremented
a = a + 1;

这应该有助于理解为什么a++ = 20;将无法正常工作。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。