C语言的前置++和后置++

一、逗号表达式

(exp1, exp2, ... , expN):逗号表达式的值等于最后一个表达式的值

int main() {
    int x = 10;
    int y = 10;
    int z = (x++, ++y, x + y);  // 22

    int arr[3][4] = { (1,2,3,4), (5,6,7,8),(9,10,11,12) };  // {4,8,0}
    cout << arr[0][1] << " " << arr[1][2] << " " << arr[2][3] << endl;  // 8, 0, 0
    return 0;
}

二、后置++

a++可翻译为如下的逗号表达式:

(int tmp = a, a = a + 1, tmp)  // 说明最后a的值加1,表达式返回的值为tmp

而这个tmp是一个临时量,相当于一个立即数,直接放在cpu的寄存器上,不占用任何内存,不能作为左值

比如这段代码编译不通过

int a = 10;
a++ = 100;

由于逗号表达式返回的是一个立即数,不能作为左值,所以编译不通过

在这里插入图片描述

三、前置++

++a可翻译为如下的逗号表达式:

(a = a + 1, a)

++a返回的就是a本身,可以作为左值(有名字,有内存,值是可以被修改的)

int a = 10;
++a = 100;   // a == 100

四、几个表达式

首先我们要知道编译器分析词法语法的原理,使用贪心思想,从左到右找到最长的且合法的运算符

1. a+++++b

a+++++b这个表达式,编译器是这样分析的:

首先+合法,然后++也合法,但是+++不合法,于是断开。

我们现在有了a++,编译器看到第三个+断开了,于是看++也合法,同理+++不合法,于是断开。

我们现在有了a++++,编译器接着往右看+合法,然后看到+b不是合法运算符,断开。

于是我们得到a+++++b

a++ ++ +b  // 不是我们所理解的a++ + ++b

由于a++返回的是立即数,不是左值(有内存),所以不能进行++
在这里插入图片描述
我们还可以自己加上空格,帮助编译器按照我们希望的方式断句

在这里插入图片描述

2. ++a+++b

++a是合法的,++也合法,+++不合法,于是表达式翻译如下:

++a++ +b;

++是单目运算符,并且是右结合的,所以翻译如下:

++(a++) +b;

同理,a++返回的是立即数,不是左值(有内存),所以不能进行前置++

在这里插入图片描述

3. (++a)+++b

    int a = 12;
    int b = 10;
    cout<< (++a)+++b;  // 23

首先计算++a,这时a的值为13,然后执行a++,这个表达式返回一个立即数,还是13,而a的值已经变成了14,立即数13加上b,结果就是23

4. (++i) + (++i)

	int i = 1;
	int res = (++i) + (++i);  // 6
	// int res = (i = i + 1, i) + (i = i + 1, i);

在这里插入图片描述
在这里插入图片描述

  • 15
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值