自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?碼哥位元2020-01-05 11:38:15

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?

在指令碼語言中,這個差異會因指令碼直譯器實現的不同而不同,因此不確定其可能有哪些具體的不同。但是在C語言中,這兩種方式的運算的不同就在於,編譯器生成的二進位制指令數是不同的。

在c語言中,a++代表,a原本的值自增,但是表示式的值是自增前的值;而++a則代表,將a的值自增,且表示式的值是自增後的值。

從這兩者的差異上我們可以看到,主要是在於表示式的值不同。而表示式的值一般情況下會寫入暫存器中。當然,如果這個值涉及到一些記憶體地址訪問的話也會被寫回到記憶體中。

編譯器在生成指令時會做一些指令最佳化(當然-O引數的最佳化會做更多)。

我們來看個簡單的例子:

for (a=0; a < 1000000; ++a) {}

在這個例子中,++a這個表示式的值並未付給其他變數,因此其實我們不需要這個表示式的值,因此,編譯器生成時只需要一條指令將a所在記憶體區的值加一即可。

但如果for中使用的是a++,雖然也是讓a加一,也沒有用到表示式的值,但是這個表示式的值也不會被最佳化掉(因為這是這個表示式的副作用,或者說這就是這個表示式的功能),因此編譯器生成指令會多一條,首先把a的值賦給暫存器,然後再將a記憶體的值加一。

差距僅在一條指令,但是如果我們的迴圈次數非常大的話,那麼這個差異其實就會越明顯,樓主可以自行在迴圈前後增加微妙級時戳,看看兩種情況下耗時差異。

希望我的回答能幫到你

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?TonyDeng2020-01-05 13:45:36

學譚浩強課程的學生常見問題,永恆話題。其實單就a++和++a來說,學生們的理解都沒問題,問題在於那些扯蛋的考試題總是無恥且無聊地考諸如x=a++*++a的x等於多少,各種各樣的“標準答案”誤人子弟,甚至好像還有什麼IT公司面試考這種的。

解答我不說了,給一個忠告吧:如果沒有把握,就不要寫這種表示式,用最直觀的,程式碼多寫一行兩行不會劣化,因為

編譯器會給你最佳化好

,勝於你寫出錯誤和帶隱患的程式碼。

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?IT愛好者之家2020-01-05 15:38:49

a++是先輸出在自加,++a是先自加在輸出

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?奧賽斯林2020-01-05 11:32:38

核心是:先++和先賦值的區別;

例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

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?爪哇程式猿2020-01-05 13:32:38

a++是先執行表示式後再自增,執行表示式時使用的是a的原值。

++a是先自增再執行表達示,執行表示式時使用的是自增後的a。

例:

int a=0

printf(“%d”,a++); //輸出0,執行完後a=1

int a=0

printf(“%d”,++a);//輸出1,執行完後a=1

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?Java猿2020-01-05 11:27:54

這兩個都是自增的,如果不賦值給其他變數,結果是一樣的,比如

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後賦值。

自增1自減1運算子,如a++和++a怎麼算呢,他們區別是什麼呢?隨風入夜潤物無聲2020-01-05 11:09:40

一個先加在迴圈,一個先迴圈再加