天天看點

c / c++ 中的未定義行為

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到底是多少位的,在不同的作業系統和編譯器也不一樣,可能歸咎于編譯器的行為更貼切