成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

EasyC++,C++中的自增與自減

開發 后端
自增與自減是C++當中兩個使用頻率非常高的運算符,不僅在循環當中用到,在日常的代碼當中也經常使用。

 [[432576]]

大家好,我是梁唐。

這是EasyC++系列的第20篇,簡單聊聊C++當中的自增與自減。

自增與自減

基本用法

自增與自減是C++當中兩個使用頻率非常高的運算符,不僅在循環當中用到,在日常的代碼當中也經常使用。

甚至C++這個名稱的由來都和自增運算符有關,表示C語言的升級版。當然這也是C#名字的由來,#這個符號表示4個疊加的加號……不得不吐槽這微軟的惡趣味。

我們都知道自增有兩種寫法,一種是i++另外一種是++i。這兩種寫法對于i這個變量的最終結果來說是一樣的,都是自增了1,但是對于自增這個操作的發生時間,則有很大的差異。

比如:

  1. int a = 0, b = 0; 
  2. cout << a++ << endl; 
  3. cout << ++b << endl; 

最終我們得到的輸出結果是0和1,差別就在執行自增的時間。對于cout << a++來說,它是先執行cout操作,再執行自增,而cout << ++b則相反,是先執行自增再執行cout。

同理,我們在賦值的時候也是一樣:

  1. int a = 0, b = 0; 
  2. int c = a++; 
  3. int d = ++b; 

c和d得到的結果同樣是一個為0,另外一個為1,原因和剛才一樣。

以上的規則同樣適用于自減。

進階理解

現在我們知道了++i的執行順序在i++之前,那么問題來了,那么它們兩者的執行順序究竟是怎樣的?差異到底在哪里呢?

對此,C++當中有一個叫做順序點的概念,順序點指的是程序執行過程中的一個點。在C++當中語句中的分號就是一個順序點,在程序處理下一條語句之前,賦值運算符、自增、自減運算符執行的所有修改都必須完成。除了分號之外,完整的表達式末尾也是一個順序點。

完整表達式的概念有點費解,C++ Primer中的定義是不是另一個更大的表達式的子表達式,比如while循環中的檢測語句就是一個完整表達式。

比如:

  1. int cnt = 0; 
  2. while (cnt++ < 10) cout << cnt << endl; 

程序的輸出結果是:

我們可以看到它的輸出結果從1開始,而并非從0開始。意味著我們在執行cout之前,cnt變量就已經完成了自增。這進一步說明了while(cnt++ < 10)本身就已經是一個完整表達式了。因此在這個表達式執行之前,C++就會完成自增的操作。

關于完整表達式還有一個坑點,就是它的執行順序。比如下面這個例子:

  1. y = (4 + x++) * (6 + x++); 

由于(4 + x++)和(6 + x++)都不是一個完整表達式,因此C++并不能保證x++的執行順序,它沒有規定是在每個子表達式計算之后執行自增,還是整個表達式計算之后再自增。它只能保證在執行到下一條語句之前x變量被自增兩次,至于它的執行時間則無法保障。

因此,最好不要寫出這樣的代碼,不僅可讀性差,而且結果也可能不可靠。

差異

我們還有一個問題沒有解決,在不影響結果的情況下,前綴的形式和后綴的形式究竟還有沒有其他差別呢?

比如:

  1. x++; 
  2. ++x; 
  3.  
  4. for (int i = 0; i < n; i++); 
  5. for (int i = 0; i < n; ++i); 

我們現在知道它們的結果是一樣的,但在內部執行是有細微差別的。差別在于后綴的形式會先生成一個拷貝值,再將拷貝值賦值給原值,而前綴的版本是直接在原值上修改。因此理論上來說,前綴版本的效率更高。當然這當中的差別非常細微,幾乎可以忽略不計。

但是在面試當中很有可能會被問到,因此有所了解即可。

指針自增、自減

自增自減操作同樣可以運用在指針上,前文當中介紹過,這表示指針的移動。自增表示向右移動一位,自減表示向左移動一位。

這很簡單,但是當我們把一些操作符結合在一起就有些麻煩了。C++當中規定,前綴運算符和解引用運算符優先級相同,按照從右到左的方式結合,后綴運算符優先級更高,從左至右。

這意味著*++pt表示先執行指針自增操作,也就是移動一位之后,再解引用。

++*pt則意味著先解引用取得值,再對改值加1。

x=*pt++由于后綴符的優先級更高,意味著先執行指針移動,再解引用。如果大家實在搞不清楚的話,可以使用括號。

責任編輯:武曉燕 來源: Coder梁
相關推薦

2021-10-21 18:52:00

C++數組存儲

2021-10-31 20:24:24

C++for循環

2021-10-27 16:27:20

C++指針操控

2021-10-29 09:44:50

C++指針變量

2021-10-20 14:03:06

C++運算符類型

2021-12-29 20:31:40

C++多態指針

2021-12-12 18:13:54

C++This指針

2021-12-08 10:43:09

C++實現

2021-11-26 00:03:20

C++編譯常量

2021-12-09 10:56:50

函數C++原型

2021-10-26 15:36:17

C++枚舉值類型

2021-11-09 10:38:16

C++Const指針

2021-12-11 19:02:03

函數C++對象

2021-11-27 11:50:09

C++靜態持續

2021-12-10 10:45:36

C++函數Stock

2021-10-26 00:19:51

C++結構體存儲

2021-12-30 14:58:58

C++函數動態

2011-05-23 14:10:00

2021-12-05 18:20:42

C++空間特性

2021-12-15 10:25:57

C++運算符重載
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九久久久久久 | 久久国产精品一区二区三区 | 欧美在线免费 | 久久久久久国产精品 | av中文在线| 91久久精品一区二区三区 | 亚洲天堂av在线 | 久久久精彩视频 | 久久一 | 日韩成人一区二区 | 波多野结衣亚洲 | 在线成人av | 久久久久久国产精品免费免费 | 黄色成人亚洲 | 午夜小电影| 久草免费视 | www.色综合 | 亚洲天堂av在线 | 一区二区三区四区在线 | 日韩国产精品一区二区三区 | 亚洲成人一区二区 | 操到爽| 黄色片在线免费看 | 一区二区三区视频在线观看 | 国产1页| 国产欧美日韩综合精品一区二区 | 亚洲国产一区二区在线 | 久久久久亚洲国产| 亚洲网站在线观看 | 日韩精品一区二区三区中文在线 | 黄色网址在线免费观看 | 夜夜精品视频 | 一区二区在线免费观看 | 国产综合在线视频 | 国产91久久久久蜜臀青青天草二 | 亚洲欧美综合精品久久成人 | 中文字幕观看 | 国产亚洲欧美另类一区二区三区 | 盗摄精品av一区二区三区 | 在线黄| 亚洲精品乱码 |