簡體   English   中英

C #define宏

[英]C #define macros

這就是我所擁有的,我想知道它是如何工作的以及它實際上做了什么。

#define NUM 5
#define FTIMES(x)(x*5)

int main(void) {
    int j = 1;
    printf("%d %d\n", FTIMES(j+5), FTIMES((j+5)));
}

它產生兩個整數:26和30。

它是如何做到的?

發生這種情況的原因是因為您的宏將打印擴展為:

printf("%d %d\n", j+5*5, (j+5)*5);

含義:

1+5*5 and (1+5)*5

由於尚未提及,解決此問題的方法是執行以下操作:

#define FTIMES(x) ((x)*5)

宏擴展中圍繞x的括號可防止運算符關聯性問題。

define只是一個字符串替換。

之后您的問題的答案是操作順序:

FTIMES(j + 5)= 1 + 5 * 5 = 26

FTIMES((j + 5))=(1 + 5)* 5 = 30

編譯器預處理只是在FTIMES看到它的地方進行替換,然后編譯代碼。 所以實際上,編譯器看到的代碼是這樣的:

#define NUM 5
#define FTIMES(x)(x*5)

int main(void)
{

    int j = 1;

    printf("%d %d\n", j+5*5,(j+5)*5);
}

然后,考慮到操作員偏好,你可以看到為什么你得到26和30。

如果你想修復它:

#define FTIMES(x) ((x) * 5)

預處理器用5替換代碼中的所有NUM個事件,用x * 5替換所有FTIMES(x)。然后編譯器編譯代碼。

它只是文字替換。

運作順序。

其中j = 1的FTIMES(j + 5)評估為:

1 + 5 * 5

這是:

25 + 1

= 26

通過制作FTIMES((j + 5)),您已將其更改為:

(1 + 5)* 5

6 * 5

三十

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM