C++中的自增與自減
自增與自減是C++當中兩個使用頻率非常高的運算符,不僅在循環(huán)當中用到,在日常的代碼當中也經(jīng)常使用。
1、自增與自減
1.1 基本用法
自增與自減是C++當中兩個使用頻率非常高的運算符,不僅在循環(huán)當中用到,在日常的代碼當中也經(jīng)常使用。
甚至C++這個名稱的由來都和自增運算符有關(guān),表示C語言的升級版。當然這也是C#名字的由來,#這個符號表示4個疊加的加號……不得不吐槽這微軟的惡趣味。
我們都知道自增有兩種寫法,一種是i++
另外一種是++i
。這兩種寫法對于i這個變量的最終結(jié)果來說是一樣的,都是自增了1,但是對于自增這個操作的發(fā)生時間,則有很大的差異。
比如:
int a = 0, b = 0; cout << a++ << endl; cout << ++b << endl;
最終我們得到的輸出結(jié)果是0和1,差別就在執(zhí)行自增的時間。對于cout << a++
來說,它是先執(zhí)行cout操作,再執(zhí)行自增,而cout << ++b
則相反,是先執(zhí)行自增再執(zhí)行cout
。
同理,我們在賦值的時候也是一樣:
int a = 0, b = 0; int c = a++; int d = ++b;
c和d得到的結(jié)果同樣是一個為0,另外一個為1,原因和剛才一樣。
以上的規(guī)則同樣適用于自減。
1.2 進階理解
現(xiàn)在我們知道了++i的執(zhí)行順序在i++之前,那么問題來了,那么它們兩者的執(zhí)行順序究竟是怎樣的?差異到底在哪里呢?
對此,C++當中有一個叫做順序點的概念,順序點指的是程序執(zhí)行過程中的一個點。在C++當中語句中的分號就是一個順序點,在程序處理下一條語句之前,賦值運算符、自增、自減運算符執(zhí)行的所有修改都必須完成。除了分號之外,完整的表達式末尾也是一個順序點。
完整表達式的概念有點費解,C++ Primer
中的定義是不是另一個更大的表達式的子表達式,比如while
循環(huán)中的檢測語句就是一個完整表達式。
比如:
int cnt = 0; while (cnt++ < 10) cout << cnt << endl;
程序的輸出結(jié)果是:
我們可以看到它的輸出結(jié)果從1開始,而并非從0開始。意味著我們在執(zhí)行cout
之前,cnt
變量就已經(jīng)完成了自增。這進一步說明了while(cnt++ < 10)
本身就已經(jīng)是一個完整表達式了。因此在這個表達式執(zhí)行之前,C++
就會完成自增的操作。
關(guān)于完整表達式還有一個坑點,就是它的執(zhí)行順序。
比如下面這個例子:
y = (4 + x++) * (6 + x++);
由于(4 + x++)
和(6 + x++)
都不是一個完整表達式,因此C++
并不能保證x++
的執(zhí)行順序,它沒有規(guī)定是在每個子表達式計算之后執(zhí)行自增,還是整個表達式計算之后再自增。它只能保證在執(zhí)行到下一條語句之前x變量被自增兩次,至于它的執(zhí)行時間則無法保障。
因此,最好不要寫出這樣的代碼,不僅可讀性差,而且結(jié)果也可能不可靠。
1.3 差異
我們還有一個問題沒有解決,在不影響結(jié)果的情況下,前綴的形式和后綴的形式究竟還有沒有其他差別呢?
比如:
x++; ++x; for (int i = 0; i < n; i++); for (int i = 0; i < n; ++i);
我們現(xiàn)在知道它們的結(jié)果是一樣的,但在內(nèi)部執(zhí)行是有細微差別的。差別在于后綴的形式會先生成一個拷貝值,再將拷貝值賦值給原值,而前綴的版本是直接在原值上修改。因此理論上來說,前綴版本的效率更高。當然這當中的差別非常細微,幾乎可以忽略不計。
但是在面試當中很有可能會被問到,因此有所了解即可。
1.4 指針自增、自減
自增自減操作同樣可以運用在指針上,前文當中介紹過,這表示指針的移動。自增表示向右移動一位,自減表示向左移動一位。
這很簡單,但是當我們把一些操作符結(jié)合在一起就有些麻煩了。C++
當中規(guī)定,前綴運算符和解引用運算符優(yōu)先級相同,按照從右到左的方式結(jié)合,后綴運算符優(yōu)先級更高,從左至右。
這意味著*++pt
表示先執(zhí)行指針自增操作,也就是移動一位之后,再解引用。
++*pt
則意味著先解引用取得值,再對改值加1。
x=*pt++
由于后綴符的優(yōu)先級更高,意味著先執(zhí)行指針移動,再解引用。如果大家實在搞不清楚的話,可以使用括號。
到此這篇關(guān)于C++中的自增與自減的文章就介紹到這了,更多相關(guān)C++自增與自減內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
注:文章轉(zhuǎn)自微信公眾號:Coder梁(ID:Coder_LT)
相關(guān)文章
C++ Leetcode實現(xiàn)從英文中重建數(shù)字
本文主要介紹了當給你一個字符串s,其中包含字母順序打亂的用英文單詞表示的若干數(shù)字(0-9)時,如何通過Leetcode按升序返回原始的數(shù)字。感興趣的童鞋可以來看看2021-11-11C語言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問題解決
這篇文章主要介紹了C語言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問題解決,文中的題目是將元素連接起來排成一個數(shù)并要求出這類結(jié)果中數(shù)最小的一個,需要的朋友可以參考下2016-03-03簡單講解C++的內(nèi)部和外部函數(shù)以及宏的定義
這篇文章主要介紹了簡單講解C++的內(nèi)部和外部函數(shù)以及宏的定義,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09