代码错误合集—1—运算符优先级的错误—i++++ii+1的区别

Posted 打喷嚏的蝴蝶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码错误合集—1—运算符优先级的错误—i++++ii+1的区别相关的知识,希望对你有一定的参考价值。

代码错误合集—1—运算符优先级的错误—i++、++i、i+1的区别

2021/6/14
在打通讯录管理系统的删除联系人时发现了这么一个问题

	//初始错误版本
	if (ret != -1)
	
		//查找到人,要进行删除操作
		for (int i = ret; i < abs->m_Size; i++)
		
			//数据前移
			abs->personArray[i] = abs->personArray[i++];
		
		abs->m_Size--;//更新通讯录中的人员数
		cout << "删除成功" << endl;
	

这一段代码特别有意思
①视频中原本是abs->personArray[i] = abs->personArray[i+1];的,但是我给写成了i++
导致了运行时出现了原本想要删除的联系人信息没有删除,还出现了其他问题
如图:

我想删除联系人2

联系人2变成了2个,联系人4也变成了两个(有5个数据是因为我想看看其他几个有没有变化,就没有做–的运算)
后来想了想,应该是运算符的优先问题

=的优先级比++的优先级低,加上i++的特殊性(先赋值后运算),所以运算顺序变成了:(原本i=1)
personArray[1]变成了personArray[2] (自增)→personArray[2]=personArray[1]→先赋值后自增→第三个人的信息变成了第二个人的信息,到此一次循环结束

接着,是我想了好久的一点:
我上面还写了for循环,循环结束后又来了一次i++,到此,已经直接跳过了i=2(即第三个人)的信息赋值给了第四个人的阶段,也就不会出现了后面所有信息都是第二个人的情况
所以第二次循环的开始,原本的i=1已经变成了i=3
接下来就是重复以上步骤,第五个人的信息变成了第四个人的了

然后就是退出循环,接着数组-1了
②之后我没多想(联系①接下去),以为是先赋值后自增的情况,就把原本代码中的i++改成了++i
改了之后又运行了一遍,发现所有联系人都没变

按照上面所说,还是优先级的问题

(原本i=1)
personArray[1]变成了personArray[2] (自增)→先自增后赋值→personArray[2]=personArray[2]→第三个人的信息变成了第三个人的信息,信息没变,到此一次循环结束

接着又是for循环里的i++,第二次循环的开始,原本的i=1变成了i=3
接着重复以上步骤,第五个人的信息变成了第五个人的信息了
依旧没变

所有,一开始没搞懂,弄了半天我放弃了,就直接改成了i+1,
是后来在写这篇文章的时候搞懂的,当然,花了一个小时左右(毕竟脑子不太灵光,[汗])
至此,这个问题也算解决了,如果以上的观点和解释有误的话,欢迎纠正
下面是正确情况下截图

.
.
.
.
.

备注1:这是存储的联系人

备注2:这是没有for循环中i++的情况(但是删减了数组)

以上是关于代码错误合集—1—运算符优先级的错误—i++++ii+1的区别的主要内容,如果未能解决你的问题,请参考以下文章

代码错误合集—1—运算符优先级的错误—i++++ii+1的区别

我 % 2 == 0 ? arr[i] = 0 : arr[i] = 1;三元运算符错误

vb运算符问题

增量运算符 ++i 不会在 python 中导致错误 [重复]

c/c++ 运算符 优先级 结合性 记录

c语言中自增自减运算符的运算次序?