c c 中的未定義行為

2021-10-01 22:12:09 字數 606 閱讀 2673

這些行為多數和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 造成這種錯誤出...