又見 a = a++ 寫法

審查單片機代碼,發現瞭如下寫法:
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.

老老實實寫讓人明白的代碼,不要總是弄些故弄玄虛的東西,搬起石頭砸自己的腳。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章