前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 中的预增(或预减)

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

作者头像
鲸落c
发布2022-11-14 16:39:51
7930
发布2022-11-14 16:39:51
举报
文章被收录于专栏:鲸落学习笔记

theme: channing-cyan highlight: a11y-dark


小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

在 C++ 中,预增(或预减)可用作左值,但后增(或后减)不能用作左值。

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

代码语言:javascript
复制
// CPP 程序来说明 Pre-increment(或 pre-decrement)
#include <cstdio>

int main()
{
    int a = 10;
    ++a = 20; 
    printf("a = %d", a);
    getchar();
    return 0;
}
代码语言:javascript
复制
a = 20

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

代码语言:javascript
复制
// CPP 程序来说明后递增(或后递减)
#include <cstdio>

int main()
{
    int a = 10;
    a++ = 20; // error
    printf("a = %d", a);
    getchar();
    return 0;
}
代码语言:javascript
复制
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,它基本上是对我们可以进一步分配的变量的引用——就像一个普通的变量。它也可以分配给一个引用,如下所示:

代码语言:javascript
复制
int &amp;ref = ++a; // 有效的
int &amp;ref = a++; // 无效的

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

代码语言:javascript
复制
int a = 10; 

在编译时,a++ 被 a 的值替换,a 是一个右值:

代码语言:javascript
复制
10 = 20; // 无效

a 的值递增

代码语言:javascript
复制
a = a + 1;

这应该有助于理解为什么a++ = 20;不起作用。

如果你发现任何不正确的内容,或者想分享一些有关本文的更多内容,请在评论区告诉我。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档