案例講解
#include<iostream>
#include <stdio.h>
int main()
{
int i = 10;
printf("%d\n", ++i);
printf("-----------------\n");
i = 10;
printf("%d\n", --i);
printf("-----------------\n");
i = 10;
printf("%d\n", i++);
printf("-----------------\n");
i = 10;
printf("%d\n", i--);
printf("-----------------\n");
i = 10;
printf("%d\n", -i++);
printf("-----------------\n");
i = 10;
printf("%d\n", -i++);
printf("-----------------\n");
system("pause");
return 0;
}
運行結果:
分析一下,這種問題很簡單的,只要是前置加加(或減減),都是先完成自增(減)操作後,再進行下一步操作(在這個案例裏面printf打印就是下一步操作);只要是後置加加(或減減),都是先完成下一步操作後,再進行自增(減)操作;如果沒有下一步操作等着,那前置和後置就都一樣了!
那麼,下面再來考慮一個問題,++i和i++那種效率更高呢?
通過上面的例子也可以看出來,如果自增運算表達式的結果,沒有被使用,二而僅僅是簡單的用於增加一個操作數,那麼前綴法和後綴法的效果是一樣的,考慮的再仔細點,如果所操作的對象的數據類型是普通的int類型或者是一般的內建數據類型,那效率方面完全沒差。
但是,如果所執行的i++,中的i(特別是如果i是一個類的話)是一個自己定義的數據類型呢?前綴式(++i)可以返回對象的引用,而後綴式(i++)必須返回對象的值,會產生較大的複製開銷,引起效率降低,所以,導致返回引用的前綴式,肯定效率要高的多。因此,在處理自定義的數據類型白變量的時候,儘量使用前綴式效率更高!
補充:什麼是內建的數據類型?答:一般指的是C++中默認的數據類型,比如:int、double、float、char,等等。
經驗總結
- 前綴式和後綴式的區別在於,當和其他操作連用的時候,前綴是先執行自增操作,後執行連用的操作;而後綴是正好反過來。
- 前綴式和後綴式的效率區別:1)對於內建的數據類型,效率沒有區別;2)對於自定義的數據類型,前綴式的效率更高。
- 前綴式和後綴式效率區別的本質:前綴式返回的是引用,後綴式返回的是值。