i++和++i是什麼意思?
*
簡單的理解就是i++是先訪問i然後再自增,而i++則是先自增然後再訪問i的值。
*
用下麵的代碼作為一個例子
*
#include? int?main()?{ int?i,x; i?=?1; x?=?1; x?=?i?++;????//先讓x變成i的值1,再讓i加1 print("%d",?x);?????//輸出的x為1 print("%d",?i);?????//輸出的i為2 i?=?1; x?=?1; x?=?++i;????//先讓i加1,?再讓x變成i的值2 print("%d",?x);????//輸出的x為2 print("%d",?i);????//輸出的i為2 } a[i++]等於a[i] 例如: a[i]=10;i=1;則: int y = a[i]; int x = a[i++]; // x=10; // 此時i=2 ---------------- i++是後加,也就是說表達式結束之後才自增。++i是先加,也就是說表達式運算之前就自增了。 一直以來,++ --語法浪費了太多人的時間。說句實在話,++ -- 在C語言中其實是一個很細節的語法,除了表達簡練外,真的沒有什麼其它的好處了。 由於中國的C語言教程長期以來被譚浩強主宰,而譚又錯誤的把++ --作為一個C語言重點來教,並增加了一些難點,把本來很簡單的語法,搞得複雜無比! 簡單的來說,++i 和 i++,在單獨使用時,就是 i=i+1。 而 a = ++i,相當於 i=i+1; a = i; 而 a = i++,相當於 a = i; i=i+1; 如果實在搞不明白++ --怎麼回事,那也不是什麼天塌下來的事。 因為a=++i完全可以寫成 i++; a=i。 a=i++完全可以寫成 a=i; i++。 而且,這也是一種好的程序風格:++ -- 語句如非特殊需要,請單獨一行使用。 這是不好的用法,屬於Unspecified Behavior operator+的兩個參數參與運算時,對left operand和right operand的求值順序,標準沒有進行嚴格定義,所以最終結果取決於相關編譯器實現,因而在不同環境下會出現不同的結果 至於你說的那個三個i相加後再自增三次這種說法,隻是為了迎合這一結果而生硬的湊出來的解釋,事實上這個表達式用clang編譯器編譯的結果就不是15 跑去又測試了一下,GCC環境下輸出為15,22,8,8,VS環境下輸出為15,24,8,8,已經印證了這一用法在不同環境下的不確定性,通過分析反彙編可以分析一下gcc和vs采用的不同策略 首先看GCC所生成的彙編 00401326movl $0x5,0x20(%esp) 0040132Emovl $0x5,0x24(%esp 這一部分是p=(i++)+(i++)+(i++); 00401336mov 0x20(%esp),%eax 0040133Aadd %eax,%eax 0040133Cadd 0x20(%esp),%eax 00401340mov %eax,0x28(%esp) 00401344incl 0x20(%esp) 00401348incl 0x20(%esp) 0040134Cincl 0x20(%esp) 可以看出確實是先相加三次再自增三次 這部分是q=(++j)+(++j)+(++j); 00401350incl 0x24(%esp) 00401354incl 0x24(%esp) 00401358mov 0x24(%esp),%eax 0040135Cadd %eax,%eax 0040135Eincl 0x24(%esp) 00401362add 0x24(%esp),%eax 可以看出其運算策略是先自增兩次,進行一次累加,再自增一次,隨後再累加一次 再來看VS生成的彙編 00FE13EE mov dword ptr [i],5 00FE13F5 mov dword ptr [j],5 p=(i++)+(i++)+(i++); 00FE13FC mov eax,dword ptr [i] 00FE13FF add eax,dword ptr [i] 00FE1402 add eax,dword ptr [i] 00FE1405 mov dword ptr [p],eax 00FE1408 mov ecx,dword ptr [i] 00FE140B add ecx,1 00FE140E mov dword ptr [i],ecx 00FE1411 mov edx,dword ptr [i] 00FE1414 add edx,1 00FE1417 mov dword ptr [i],edx 00FE141A mov eax,dword ptr [i] 00FE141D add eax,1 00FE1420 mov dword ptr [i],eax 這一部分運算策略和GCC一致 q=(++j)+(++j)+(++j); 00FE1423 mov eax,dword ptr [j] 00FE1426 add eax,1 00FE1429 mov dword ptr [j],eax 00FE142C mov ecx,dword ptr [j] 00FE142F add ecx,1 00FE1432 mov dword ptr [j],ecx 00FE1435 mov edx,dword ptr [j] 00FE1438 add edx,1 00FE143B mov dword ptr [j],edx 00FE143E mov eax,dword ptr [j] 00FE1441 add eax,dword ptr [j] 00FE1444 add eax,dword ptr [j] 00FE1447 mov dword ptr [q],eax 這一部分卻是先自增三次,再進行兩次累加,於是就產生了和GCC不相同的運算結果 通過彙編隻是說明一下,這種用法在不同的編譯環境下無法預知其結果,所以應該避免這種用法,也不要試圖在未知環境中預測這種用法的行為 * a = ++i,相當於 i=i+1; a = i; * a = i++,相當於 a = i; i=i+1; 如果有表達式 a = i++? 它等價於 a = i ; i = i + 1; 如果有表達式 a = ++i? 它等價於? ?i = i + 1; a = i; 1 首先兩者的區別是:前者是先賦值,然後再自增;後者是先自增,後賦值 2 ++i和i++都是分兩步完成的。因為++i 是後麵一步才賦值的,所以它能夠當作一個變量進行級聯賦值,++i =?a =b,即 ++i 是一個左值;i++ 的後麵一步是自增,不是左值。 3? ++i 和i++ 的使用,一般來說在循環域裏麵,這兩者並沒有什麼很大的區別,因為編譯器一般都會給你做優化。但是要注意其生存周期,以及很難察覺的寫髒,就好像指針delete以後一定要賦予0一樣,我們要注意i值在程序流中的變化。 * 區別在於:++先做別的事,再自己加1,++i先自己加1,再做別的事情,形象的理解,你可以把++i比作自私的人,首先考慮自己的事,i++是無私的,先為別人照想,這樣方便記憶。 * 首先我們定義一個變量i,int i=5,然後我們做執行printf(“%d”,i++),我們會發現輸出結果是5。 * 是為什麼呢,我們要搞清楚printf(“%d”,i++)這句話是做兩件事:1.輸出i、2.i=i+1,這裏的順序,是先輸出i,再執行i=i+1。 * 然後我們初始化變量i,i=5;、然後我們做執行printf(“%d”,++i)、我們會發現輸出結果是6,其實printf(“%d”,++i);做的也是這兩件事:1.輸出i、2.i=i+1,隻是先做i=i+1,然後輸出i。 為c語言,java等中常見算式,即i=i+2。 但兩者還是有一定區別。 i=i+2 比 i+=2多了一次對變量 i 的運算。後者效率高。 C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。 盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標準規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。 二十世紀八十年代,為了避免各開發廠商用的C語言語法產生差異,由美國國家標準局為C語言製定了一套完整的美國國家標準語法,稱為ANSI C,作為C語言最初的標準。目前2011年12月8日,國際標準化組織(ISO)和國際電工委員會(IEC)發布的C11標準是C語言的第三個官方標準,也是C語言的最新標準,該標準更好的支持了漢字函數名和漢字標識符,一定程度上實現了漢字編程。 i=5,單看i++和++i都是6 i--和--i也都是4, 但是把這些放到運算式子中就不一樣了, (1)i++和i--是先運算後++或--, (2)++i和--i是先++或--後運算, 也就是說(1)中++和--沒有用,用i=5算式子 但(2)中就要用6或4算式子 S(i,:)中的“i”表示矩陣S的第i行,“:”就表示這一行的所有列,因此S(i,:)就表示S陣的第i行的所有元素嘍! 相應的S(:,i)就表示S陣的第i列嘍! *i++ 是先*後++.這的++是針對i; ++*i 是先*在++.這的++是針對(*i). *i++ 因為i++是使用後++所以,要先*後,在++; 有個程序你可以運行驗證。 #include #include using namespace std; int main() { int num[3]={1,4,3}; int *i=num; cout<><> // cout<><> return 0; } c++的程序。 樓主看你的補充了,你要清楚++是針對誰的。 main() { int a = 0,*i; i = &a; *i++; printf("%d",a); } 首先,*i取出來就是a就是0.然後++是針對i的,不是(*i)所以a沒變。 main() { int a = 0,*i; i = &a; ++*i; printf("%d",a); } 也是首先*i取出來就是a為0,然而++是針對(*i)的,所以a值+1了。就是1. 轉載請注明出處句子大全網 » i++和++i是什麼意思數組a[i++]是等於a[i]還是a[i+1]?
i++是什麼意思
C語言 p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j);
i++和++i的區別
++i和i++有什麼區別啊?
i+=2是什麼意思?
++i,--i,i++,i-- ?
matlab中這個矩陣S(i,:)是什麼意思?
*i++與 ++*i