這些行為多數和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到底是多少位的,在不同的作業系統和編譯器也不一樣,可能歸咎於編譯器的行為更貼切
未定義的行為 i i
i i 1 先算出左邊的值,置為0 2 執行i 的 1操作.3 將左邊的值賦給i.2和3在不同編譯器中經過優化後有不同的執行順序。所以執行後i可能是0,可能是1.能執行不代表是正確的。這種寫法,是c標準嚴格禁止的。c標準裡,叫做未定義行為。在c c 中,為了少寫一行 或者為了和某條彙編語句對應,這顆...
未定義的索引 php中 php的未定義索引如何解決
通常出現未定義的索引問題是由於陣列沒有這個值造成的,陣列分為關聯陣列和索引陣列,索引陣列是數字下標 關聯陣列是鍵值下標。解決辦法 判斷陣列中是否包含下標鍵值為id的值,如果沒有,則返回錯誤資訊,如何判斷呢,最簡單的方法就是用函式isset來判斷,如isset post id 存在則返回true,反之...
js報未定義 JS的未定義和undefined
background if window else console.log server side rendering 當我啟專案的時候,不斷的報錯 window is not defined 原因在js中,有一種錯誤是 referenceerror x is not defined 造成這種錯誤出...