文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 面对c里面给数组赋值,但索引在等号两侧都出现且至少一侧发生变化——歧义,解析编译器表现:
- 一、实例代码及其等价形式
- 总结
面对c里面给数组赋值,但索引在等号两侧都出现且至少一侧发生变化——歧义,解析编译器表现:
提示:这里可以添加本文要记录的大概内容:
前置条件:
vectorae = {1, 2, 3, 4, 5}; int i = 0;
提示:以下是本篇文章正文内容,下面案例可供参考
一、实例代码及其等价形式左侧为实例代码,右侧注释为等价语句:
ae[i] = ae[i = 1]; // 例一 ae[1] = ae[1], i = 1
ae[i = 1] = ae[i]; // 例二 ae[1] = ae[0], i = 1
ae[i = 1] = ae[i = 2]; // 例三 ae[1] = ae[2], i = 1
ae[i = 2] = ae[i = 1]; // 例四 ae[2] = ae[1], i = 2
ae[i] = ae[i++]; // 例五 ae[1] = ae[0], i = 1
ae[i] = ae[++i]; // 例六 ae[2] = ae[2], i = 1
ae[++i] = ae[++i]; // 例七 ae[2] = ae[1], i = 2
总结
上述三个例子表明,赋值运算符‘=’右侧的索引先于左侧索引进行变化:
- 当右侧索引变化,左侧索引无变化(例一、例六),右侧索引会影响左侧索引值(均变为1)。
注意:例五同样是右侧索引有变化、左侧索引无变化类型,但因i++与++i在返回值上的顺序优先问题(++i返回i+1;i++返回i,之后再令i+=1),此例在执行时,赋值运算符‘=’右侧的索引先返回i原本的值0,再令i加1,此处的加1操作使i变为1,于是影响到左侧的索引i,结果就等价于ae[1]=ae[0]。 - 当左侧索引变化,右侧索引无变化(例二),右侧索引具备运算优先级,先于左侧索引确定为0,左侧索引后变化为1。
- 当两侧索引均有变化(例三、例四、例七),右侧索引先于左侧索引变化,左侧索引再进行自身的变化。
特别的:对于例七,右侧索引使i变为1,左侧索引在此基础上再加1变为2,于是等价于:ae[2]=ae[1]。



