c / c++ 程式設計當中會遇到一些未定義的行為
這些行為多數和c/c++标準當中的定義不明确有關系
第一種,操作數的執行順序
标準當中,隻有四個操作數有過明确的執行順序:
邏輯運算符&&和|| 從左到右,短路測試
?:條件運算符 先執行?前面的表達式
逗号運算符,從左到右
其他的運算符,都沒有定義執行順序,也就是說 v = f1()+f2()這個表達式,f1()和f2()誰先執行是未定義的
例如: v = (++i )/ (--i) ;
v = a[++i][++i]; 沒有定義兩個[]裡面的表達式的先後執行順序
二. 多參數的函數
多參數函數,比如func(par1, par2)
當par1和par2是兩個表達式的時候,par1和par2誰先執行是沒有定義的
當然,執行的結果,是右側的參數先入棧,左側的後入棧,這是有明确定義的
printf("%d %d", ++i, ++i);
三 涉及到中間變量的行為
典型的就是i++這種
比如: i = i++;
i++ 先傳回i的值,再自增。 但是這裡并沒有定義這個自增後對自身複制的先後順序
i = ++i 就沒有這個問題
四 其他情況,待整理
前面三種都是未定義順序的行為, 其他的未定義的行為肯定還有,有待進一步的搜集整理分類:
比如long到底是多少位的,在不同的作業系統和編譯器也不一樣,可能歸咎于編譯器的行為更貼切