2012-12-31 10:36:20Morris
[C/C++] #define 語法練習
#define 說實在打 ACM 題目是只有常數還蠻常使用的,而在線上賽 code force, top coder ... 等,將會看到堆積如山的 #define 去壓縮打 coding 時間。
1. 使用 ... 代表傳入參數,後面使用 __VA_ARGS__ 表示參數位置
2. 使用 # 前綴傳參數,或者打在 #define 中,則會轉字串 (加入雙引號)
3. 使用 #@ 前綴傳參數,或者打在 #define 中,則會轉字元 (加入單引號)
4. 使用 \ 跨行,不想讓 define 一行太多,最後一個字元打上 '\' 就可以跨行了。
5. #define 只能使用識別字,即 $, _, 0~9, a-z, A-Z, 函數的話則會多 ()
以下的代碼是輾轉相除法 跟 取最大值。
這裡多了一個函數指標,指向函數。
#include <stdio.h>
#define $ int
#define E return
#define W(...) while(__VA_ARGS__)
#define SF(x) scanf("%d", &x)
#define AC(...) printf("%d %d\n", __VA_ARGS__)
$ G($ W, $ WW) {
E WW ? G(WW, W%WW) : W;
}
$ M($ W, $ WW) {
$ A[] = {W, WW};
E A[W < WW];
}
main() {
$ W, WW;
$ (*F[])($,$) = {G,M};
W(SF(W), ~SF(WW))
AC((*F)(W, WW), (*(F+1))(W, WW));
}
1. 使用 ... 代表傳入參數,後面使用 __VA_ARGS__ 表示參數位置
2. 使用 # 前綴傳參數,或者打在 #define 中,則會轉字串 (加入雙引號)
3. 使用 #@ 前綴傳參數,或者打在 #define 中,則會轉字元 (加入單引號)
4. 使用 \ 跨行,不想讓 define 一行太多,最後一個字元打上 '\' 就可以跨行了。
5. #define 只能使用識別字,即 $, _, 0~9, a-z, A-Z, 函數的話則會多 ()
以下的代碼是輾轉相除法 跟 取最大值。
這裡多了一個函數指標,指向函數。
#include <stdio.h>
#define $ int
#define E return
#define W(...) while(__VA_ARGS__)
#define SF(x) scanf("%d", &x)
#define AC(...) printf("%d %d\n", __VA_ARGS__)
$ G($ W, $ WW) {
E WW ? G(WW, W%WW) : W;
}
$ M($ W, $ WW) {
$ A[] = {W, WW};
E A[W < WW];
}
main() {
$ W, WW;
$ (*F[])($,$) = {G,M};
W(SF(W), ~SF(WW))
AC((*F)(W, WW), (*(F+1))(W, WW));
}