今天在码代码的时候,写了个:
var tIndex = 0;
…….
case 38://up
tIndex = (tIndex+1)%crtTMax;
一个按键触发
但是一不小心写成了
tIndex = (tIndex++)%crtTMax;
之后便发现无论怎么按键触发tIndex的值都是0
后来仔细想了下:
主要是编译器对于这种多种赋值处理问题:
后置++是先引用再赋值,前置++是先赋值再引用
所以
(tIndex++)= 0
0%crtTMax
然后根据“=”处理规则,从右向左赋值
先是
tIndex = tIndex+1;
tIndex = 0%crtTMax;
所以tIndex一直为0
若改为
tIndex = (++tIndex)%crtTMax;
便没了问题。
下面引用一个例题来详细说明下自增与自减运算符:
表达式(i++)+(++i)+(–i)+(i++)的结果是:8
i值是4
分析如下(Tc环境):
1、++和–是C中的自增自减运算符,使变量值加1或减1。
2、++和–放在变量前后的位置不同,运算的机制也不同。如果放在前面,可以理解为“先增(减)值,后引用”;如果放在后面,可以理解为“先引用,后增(减)值”。“引用”的含义是指将变量的当前值,放在表达式中进行计算。“增(减)值”的含义是指变量自身值的变化。
3、最关键的一点就是:当程序扫描由多个++和–构成复杂的表达式时,会首先检查所有的前置运算++或–(先增减值,后引用),通过计算得到一个值,然后将这个值重复加N次即可,N是自增自减运算的个数。
4、以(i++) + (++i) + (–i) + (i++)为例,首先检查有2个前置运算,一个是++,一个是–,i的值为2,有4个自增减运算,所以2*4=8。再复杂的表达式也是如此。 i本身的值就很好理解,不必多说。
5、这种表达式书写复杂,理解困难,建议不要这样使用为好。