[英]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
的括號可防止運算符關聯性問題。
之后您的問題的答案是操作順序:
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.