审查单片机代码,发现了如下写法:
void funcXX()
{
int a = 0;
//省略过程。
a = (a++)%2;
if (a == 0)
{
//逻辑省略。
}
}
意图是每次调用此函数,a在0到1之间变换。
单不说a = (a++)%2写法对不对,每次都初始化a,就知道不可能变,a肯定每次都是固定的值,要么1,要么0.
再说a = (a++)%2写法。在C++标准中有一个很重要的概念:sequence points(顺序点)。
原文定义如下:Between consecutive "sequence points" an object's value can be modified only once by an expression. 大致意思是说:在相邻的两个序点中间,一个object的值可以并且只能被赋值一次。
参考:MSDN:C Sequence Points:
http://msdn.microsoft.com/en-us/library/azk8zbxd.aspx
a = (a++)%2处于两个连续的序点之间,a被赋值两次。因此,a的值不确定,可能是1,也可能是0.实际验证,VC中,a的值为1,C196单片机编译器KC196中,a的值为0.
老老实实写让人明白的代码,不要总是弄些故弄玄虚的东西,搬起石头砸自己的脚。