2017-04-14 33 views
-1

準確操作將此代碼應該可識別#令牌, 當我在不同的編譯器上運行此代碼時,它會給出不同的輸出。爲什麼?什麼將輸出和#

#include <stdio.h> 
#define foo(a,b) #b 
int main(void) { 
    int a=10,b=15,ab=20; 
    // your code goes here 
    printf("%d",ab+foo(a,b)); 
    return 0; 
} 
+0

c宏定義'#'和'##'操作 –

回答

2

C預處理器確實使用#作爲運算符。這是一個串化操作符。

您的宏將採取任何標記b,並將其變爲字符串文字。我的腦海中簡單地使用它,正在調試:

#define print_int(a) printf(#a " = %d", a); 

但是你的程序只是展示未定義的行爲。讓我們展開宏:

printf("%d",ab+"b"); 

您取整數(20),並將其用於字符串文字的指針運算。實際上過去了文字的末尾,從而導致了未定義的行爲。

+0

'ab'具有值'20',而不是'150'。它被添加到一個指針,不用作索引。 – Peter

+0

@彼得 - 回答遲到讓人覺得'ab'是'a * b'。更正了,謝謝。 – StoryTeller