//把變量和表達式轉換成字符串
/*
寫調試代碼的時候,編寫由包含變量名和後跟變量的字符數組組成的打印表達式是很乏味的。幸運的是,標準C具有字符串化運算符'#'。在一個預處理器宏中的參數前面使用一個#,預處理器會把這個參數轉換爲一個字符數組。把這一點與沒有插入標點符號的若干個字符數組結合而鏈接車給你一個單獨的字符數組,能夠生成一個十分方便的宏與調試期間打印出變量的值:
#define PR(x) cout << #x " = " << x << endl;
如果調用宏PR(a)來打印變量a的值,它和下面的代碼有相同的效果:
cout << "a = " << a << endl;
整個表達式工作過程一樣。下面的程序使用一個宏創建了一種速記方式打印出字符串化的表達式,然後計算表達式並打印出結果:
*/
//:
#include<iostream>
using namespace std;
const int maxn = 50;
//以一個宏開始,節省輸入,增加程序可讀性。
//使用了“字符串化的預處理器特徵(在表達式前用一個'#'實現),其作用是獲得
//任何一個表達式並把它轉換成爲一個字符數組。”以此來允許打印表達式……
#define P(EX) \
cout << #EX << ":" << EX << endl;
int main()
{
int n, a[maxn];
cout << "Enter the size: ";
cin >> n;
cout << "Enter n numbers:" << endl;
for(int i = 0; i < n; ++i)
a[i] = i;
int* ip = a;
P(*ip);
P(*++ip);
P(*(ip+5));
int* ip2 = ip + 5;
P(*ip2);
P(*(ip2-4));
P(*--ip2);
P(ip2-ip);
return 0;
}///:~
/*
可以看到這樣的技術是如何成爲必不可少的,特別是在沒有調試器(或者必須使用多個開發環境)的情況下。當不想調試時,也可以插入一個#ifdef使得定義的P(EX)不起作用。
*/