-
1 # Java猿
-
2 # 奧賽斯林
核心是:先++和先賦值的區別;
例1:
int a = 0;
int b = 0;
b = a++;
則a =1,b也=1
例2:
int a = 0;
int b = 0;
b = ++a;
則a =1,b=0
-
3 # 碼哥位元
在指令碼語言中,這個差異會因指令碼直譯器實現的不同而不同,因此不確定其可能有哪些具體的不同。但是在C語言中,這兩種方式的運算的不同就在於,編譯器生成的二進位制指令數是不同的。
在c語言中,a++代表,a原本的值自增,但是表示式的值是自增前的值;而++a則代表,將a的值自增,且表示式的值是自增後的值。
從這兩者的差異上我們可以看到,主要是在於表示式的值不同。而表示式的值一般情況下會寫入暫存器中。當然,如果這個值涉及到一些記憶體地址訪問的話也會被寫回到記憶體中。
編譯器在生成指令時會做一些指令最佳化(當然-O引數的最佳化會做更多)。
我們來看個簡單的例子:
for (a=0; a < 1000000; ++a) {}
在這個例子中,++a這個表示式的值並未付給其他變數,因此其實我們不需要這個表示式的值,因此,編譯器生成時只需要一條指令將a所在記憶體區的值加一即可。
但如果for中使用的是a++,雖然也是讓a加一,也沒有用到表示式的值,但是這個表示式的值也不會被最佳化掉(因為這是這個表示式的副作用,或者說這就是這個表示式的功能),因此編譯器生成指令會多一條,首先把a的值賦給暫存器,然後再將a記憶體的值加一。
差距僅在一條指令,但是如果我們的迴圈次數非常大的話,那麼這個差異其實就會越明顯,樓主可以自行在迴圈前後增加微妙級時戳,看看兩種情況下耗時差異。
-
4 # 爪哇程式猿
a++是先執行表示式後再自增,執行表示式時使用的是a的原值。
++a是先自增再執行表達示,執行表示式時使用的是自增後的a。
例:
int a=0
printf("%d",a++); //輸出0,執行完後a=1
int a=0
printf("%d",++a);//輸出1,執行完後a=1
-
5 # TonyDeng
學譚浩強課程的學生常見問題,永恆話題。其實單就a++和++a來說,學生們的理解都沒問題,問題在於那些扯蛋的考試題總是無恥且無聊地考諸如x=a++*++a的x等於多少,各種各樣的“標準答案”誤人子弟,甚至好像還有什麼IT公司面試考這種的。
解答我不說了,給一個忠告吧:如果沒有把握,就不要寫這種表示式,用最直觀的,程式碼多寫一行兩行不會劣化,因為編譯器會給你最佳化好,勝於你寫出錯誤和帶隱患的程式碼。
回覆列表
這兩個都是自增的,如果不賦值給其他變數,結果是一樣的,比如
Int a=0;
a++;
System.out.println(a);
a=0;
++a;
System.out.println(a);
這時輸出的結果一樣,都是1。
如果複製別的變數,比如
int a=0;
int b =0;
b=a++;和b=++a;是不同的,前著是0後者是1;
因為前著是先賦值後加1,後者是先加1後賦值。