第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用C預處理器編寫while循環(huán)?

如何用C預處理器編寫while循環(huán)?

C
慕婉清6462132 2019-10-06 14:12:46
我是從教育/黑客的角度提出這個問題的(我真的不想這樣編碼)。是否可以僅使用C預處理程序指令來實現(xiàn)while循環(huán)。我知道宏不能遞歸擴展,那么如何實現(xiàn)呢?
查看完整描述

3 回答

?
嗶嗶one

TA貢獻1854條經(jīng)驗 獲得超8個贊

如果要實現(xiàn)while循環(huán),則需要在預處理器中使用遞歸。進行遞歸的最簡單方法是使用延遲表達式。延遲表達式是需要更多掃描才能完全擴展的表達式:


#define EMPTY()

#define DEFER(id) id EMPTY()

#define OBSTRUCT(id) id DEFER(EMPTY)()

#define EXPAND(...) __VA_ARGS__


#define A() 123

A() // Expands to 123

DEFER(A)() // Expands to A () because it requires one more scan to fully expand

EXPAND(DEFER(A)()) // Expands to 123, because the EXPAND macro forces another scan

為什么這很重要?當宏被掃描并擴展時,它會創(chuàng)建一個禁用上下文。此禁用上下文將導致標記為藍色,該標記指向當前正在擴展的宏。因此,一旦將其涂成藍色,宏將不再擴展。這就是為什么宏不遞歸擴展的原因。但是,禁用上下文僅在一次掃描期間存在,因此通過延遲擴展,我們可以防止宏變成藍色。我們只需要對表達式進行更多掃描即可。我們可以使用以下EVAL宏來做到這一點:


#define EVAL(...)  EVAL1(EVAL1(EVAL1(__VA_ARGS__)))

#define EVAL1(...) EVAL2(EVAL2(EVAL2(__VA_ARGS__)))

#define EVAL2(...) EVAL3(EVAL3(EVAL3(__VA_ARGS__)))

#define EVAL3(...) EVAL4(EVAL4(EVAL4(__VA_ARGS__)))

#define EVAL4(...) EVAL5(EVAL5(EVAL5(__VA_ARGS__)))

#define EVAL5(...) __VA_ARGS__

接下來,我們定義一些用于執(zhí)行某些邏輯的運算符(例如if等):


#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)

#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__


#define CHECK_N(x, n, ...) n

#define CHECK(...) CHECK_N(__VA_ARGS__, 0,)


#define NOT(x) CHECK(PRIMITIVE_CAT(NOT_, x))

#define NOT_0 ~, 1,


#define COMPL(b) PRIMITIVE_CAT(COMPL_, b)

#define COMPL_0 1

#define COMPL_1 0


#define BOOL(x) COMPL(NOT(x))


#define IIF(c) PRIMITIVE_CAT(IIF_, c)

#define IIF_0(t, ...) __VA_ARGS__

#define IIF_1(t, ...) t


#define IF(c) IIF(BOOL(c))

現(xiàn)在,使用所有這些宏,我們可以編寫一個遞歸WHILE宏。我們使用WHILE_INDIRECT宏來遞歸地引用自身。這可以防止宏被涂成藍色,因為它將在不同的掃描(并使用不同的禁用上下文)下擴展。該WHILE宏帶有一個謂詞宏,一個運算符宏和一個狀態(tài)(即可變參數(shù))。它將繼續(xù)將此運算符宏應用于狀態(tài),直到謂詞宏返回false(為0)。


#define WHILE(pred, op, ...) \

    IF(pred(__VA_ARGS__)) \

    ( \

        OBSTRUCT(WHILE_INDIRECT) () \

        ( \

            pred, op, op(__VA_ARGS__) \

        ), \

        __VA_ARGS__ \

    )

#define WHILE_INDIRECT() WHILE

出于演示目的,我們將創(chuàng)建一個謂詞,以檢查何時參數(shù)數(shù)量為1:


#define NARGS_SEQ(_1,_2,_3,_4,_5,_6,_7,_8,N,...) N

#define NARGS(...) NARGS_SEQ(__VA_ARGS__, 8, 7, 6, 5, 4, 3, 2, 1)


#define IS_1(x) CHECK(PRIMITIVE_CAT(IS_1_, x))

#define IS_1_1 ~, 1,


#define PRED(x, ...) COMPL(IS_1(NARGS(__VA_ARGS__)))

接下來,我們創(chuàng)建一個運算符,將只連接兩個令牌。我們還創(chuàng)建了一個最終運算符(稱為M),用于處理最終輸出:


#define OP(x, y, ...) CAT(x, y), __VA_ARGS__ 

#define M(...) CAT(__VA_ARGS__)

然后使用WHILE宏:


M(EVAL(WHILE(PRED, OP, x, y, z))) //Expands to xyz

當然,任何種類的謂詞或運算符都可以傳遞給它。


查看完整回答
反對 回復 2019-10-06
?
炎炎設計

TA貢獻1808條經(jīng)驗 獲得超4個贊

好吧,這不是一個while循環(huán),而是一個計數(shù)器循環(huán),盡管如此,在干凈的CPP中也可以循環(huán)(沒有模板,也沒有C ++)


#ifdef pad_always


#define pad(p,f) p##0


#else


#define pad0(p,not_used) p

#define pad1(p,not_used) p##0


#define pad(p,f) pad##f(p,)


#endif


// f - padding flag

// p - prefix so far

// a,b,c - digits

// x - action to invoke


#define n0(p,x)

#define n1(p,x)         x(p##1)

#define n2(p,x) n1(p,x) x(p##2)

#define n3(p,x) n2(p,x) x(p##3)

#define n4(p,x) n3(p,x) x(p##4)

#define n5(p,x) n4(p,x) x(p##5)

#define n6(p,x) n5(p,x) x(p##6)

#define n7(p,x) n6(p,x) x(p##7)

#define n8(p,x) n7(p,x) x(p##8)

#define n9(p,x) n8(p,x) x(p##9)


#define n00(f,p,a,x)                       n##a(pad(p,f),x)

#define n10(f,p,a,x) n00(f,p,9,x) x(p##10) n##a(p##1,x)

#define n20(f,p,a,x) n10(f,p,9,x) x(p##20) n##a(p##2,x)

#define n30(f,p,a,x) n20(f,p,9,x) x(p##30) n##a(p##3,x)

#define n40(f,p,a,x) n30(f,p,9,x) x(p##40) n##a(p##4,x)

#define n50(f,p,a,x) n40(f,p,9,x) x(p##50) n##a(p##5,x)

#define n60(f,p,a,x) n50(f,p,9,x) x(p##60) n##a(p##6,x)

#define n70(f,p,a,x) n60(f,p,9,x) x(p##70) n##a(p##7,x)

#define n80(f,p,a,x) n70(f,p,9,x) x(p##80) n##a(p##8,x)

#define n90(f,p,a,x) n80(f,p,9,x) x(p##90) n##a(p##9,x)


#define n000(f,p,a,b,x)                           n##a##0(f,pad(p,f),b,x)

#define n100(f,p,a,b,x) n000(f,p,9,9,x) x(p##100) n##a##0(1,p##1,b,x)

#define n200(f,p,a,b,x) n100(f,p,9,9,x) x(p##200) n##a##0(1,p##2,b,x)

#define n300(f,p,a,b,x) n200(f,p,9,9,x) x(p##300) n##a##0(1,p##3,b,x)

#define n400(f,p,a,b,x) n300(f,p,9,9,x) x(p##400) n##a##0(1,p##4,b,x)

#define n500(f,p,a,b,x) n400(f,p,9,9,x) x(p##500) n##a##0(1,p##5,b,x)

#define n600(f,p,a,b,x) n500(f,p,9,9,x) x(p##600) n##a##0(1,p##6,b,x)

#define n700(f,p,a,b,x) n600(f,p,9,9,x) x(p##700) n##a##0(1,p##7,b,x)

#define n800(f,p,a,b,x) n700(f,p,9,9,x) x(p##800) n##a##0(1,p##8,b,x)

#define n900(f,p,a,b,x) n800(f,p,9,9,x) x(p##900) n##a##0(1,p##9,b,x)


#define n0000(f,p,a,b,c,x)                               n##a##00(f,pad(p,f),b,c,x)

#define n1000(f,p,a,b,c,x) n0000(f,p,9,9,9,x) x(p##1000) n##a##00(1,p##1,b,c,x)

#define n2000(f,p,a,b,c,x) n1000(f,p,9,9,9,x) x(p##2000) n##a##00(1,p##2,b,c,x)

#define n3000(f,p,a,b,c,x) n2000(f,p,9,9,9,x) x(p##3000) n##a##00(1,p##3,b,c,x)

#define n4000(f,p,a,b,c,x) n3000(f,p,9,9,9,x) x(p##4000) n##a##00(1,p##4,b,c,x)

#define n5000(f,p,a,b,c,x) n4000(f,p,9,9,9,x) x(p##5000) n##a##00(1,p##5,b,c,x)

#define n6000(f,p,a,b,c,x) n5000(f,p,9,9,9,x) x(p##6000) n##a##00(1,p##6,b,c,x)

#define n7000(f,p,a,b,c,x) n6000(f,p,9,9,9,x) x(p##7000) n##a##00(1,p##7,b,c,x)

#define n8000(f,p,a,b,c,x) n7000(f,p,9,9,9,x) x(p##8000) n##a##00(1,p##8,b,c,x)

#define n9000(f,p,a,b,c,x) n8000(f,p,9,9,9,x) x(p##9000) n##a##00(1,p##9,b,c,x)


#define n00000(f,p,a,b,c,d,x)                                   n##a##000(f,pad(p,f),b,c,d,x)

#define n10000(f,p,a,b,c,d,x) n00000(f,p,9,9,9,9,x) x(p##10000) n##a##000(1,p##1,b,c,d,x)

#define n20000(f,p,a,b,c,d,x) n10000(f,p,9,9,9,9,x) x(p##20000) n##a##000(1,p##2,b,c,d,x)

#define n30000(f,p,a,b,c,d,x) n20000(f,p,9,9,9,9,x) x(p##30000) n##a##000(1,p##3,b,c,d,x)

#define n40000(f,p,a,b,c,d,x) n30000(f,p,9,9,9,9,x) x(p##40000) n##a##000(1,p##4,b,c,d,x)

#define n50000(f,p,a,b,c,d,x) n40000(f,p,9,9,9,9,x) x(p##50000) n##a##000(1,p##5,b,c,d,x)

#define n60000(f,p,a,b,c,d,x) n50000(f,p,9,9,9,9,x) x(p##60000) n##a##000(1,p##6,b,c,d,x)

#define n70000(f,p,a,b,c,d,x) n60000(f,p,9,9,9,9,x) x(p##70000) n##a##000(1,p##7,b,c,d,x)

#define n80000(f,p,a,b,c,d,x) n70000(f,p,9,9,9,9,x) x(p##80000) n##a##000(1,p##8,b,c,d,x)

#define n90000(f,p,a,b,c,d,x) n80000(f,p,9,9,9,9,x) x(p##90000) n##a##000(1,p##9,b,c,d,x)


#define cycle5(c1,c2,c3,c4,c5,x) n##c1##0000(0,,c2,c3,c4,c5,x)

#define cycle4(c1,c2,c3,c4,x) n##c1##000(0,,c2,c3,c4,x)

#define cycle3(c1,c2,c3,x) n##c1##00(0,,c2,c3,x)

#define cycle2(c1,c2,x) n##c1##0(0,,c2,x)

#define cycle1(c1,x) n##c1(,x)


#define concat(a,b,c) a##b##c


#define ck(arg) a[concat(,arg,-1)]++;

#define SIZEOF(x) (sizeof(x) / sizeof((x)[0]))


void check5(void)

{

    int i, a[32769];


    for (i = 0; i < SIZEOF(a); i++) a[i]=0;


    cycle5(3,2,7,6,9,ck);


    for (i = 0; i < SIZEOF(a); i++) if (a[i] != 1) printf("5: [%d] = %d\n", i+1, a[i]);

}


查看完整回答
反對 回復 2019-10-06
  • 3 回答
  • 0 關(guān)注
  • 736 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號