最後一個運算式”0123456789ABCDEF”[0]是一個常用的技巧,它可以快速將一個數字轉換為16進位字元。”0123456789ABCDEF”是一個字串字面量,類型是char[17](在C中)或者const char[17](在C++中),轉換後的指標類型分別為char*和const char*,因此”0123456789ABCDEF”[0]就是第0個元素’0’。這個技巧常常用在進位轉換中,以下代碼將一個長整數的記憶體映像轉換為16進位表示:
char* convert( unsigned long Value )
{
static char Buffer[sizeof( unsigned long ) * 2 + 1];
int i;
for( i = sizeof( unsigned long ) * 2 - 1; i >= 0; --i )
{
Buffer[i] = "0123456789ABCDEF"[Value % 16];
Value /= 16;
}
return Buffer;
}
當然,筆者在這裡介紹這些古怪的運算式僅僅為了對下標運算子進行一些探討,並非鼓勵人們編寫這樣的代碼。但在某些情況下,形如"0123456789ABCDEF"[Value%16]這樣的運算式仍然是一個很好的選擇,與下面的代碼相比:
Remainder = Value % 16;
if( Remainder >= 10 ) Buffer[i] = 'A' + Remainder - 10;
else Buffer[i] = '0' + Remainder;
前者顯然更加簡明、精練,更容易閱讀,所以,應根據不同的情況進行取捨。代碼中使用了除法和求餘運算,有些人很喜歡把這些運算直接用移位代替,以追求極速。但現代編譯器對代碼的最佳化已經非常出色,乘除運算與直接移位之間的效率差別已經小到幾乎可以忽略不計的程度,除非在需要進行大量數學運算或對效率極其敏感的場合,否則所提高的那麼一點微末的速度是無法彌補可讀性的損失的。在可讀性、空間及效率之間應進行均衡的選擇,而不是盲目追求極端。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/supermegaboy/archive/2009/11/23/4855000.aspx