準確操作將此代碼應該可識別#令牌, 當我在不同的編譯器上運行此代碼時,它會給出不同的輸出。爲什麼?什麼將輸出和#
#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;
}
準確操作將此代碼應該可識別#令牌, 當我在不同的編譯器上運行此代碼時,它會給出不同的輸出。爲什麼?什麼將輸出和#
#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;
}
C預處理器確實使用#
作爲運算符。這是一個串化操作符。
您的宏將採取任何標記b
,並將其變爲字符串文字。我的腦海中簡單地使用它,正在調試:
#define print_int(a) printf(#a " = %d", a);
但是你的程序只是展示未定義的行爲。讓我們展開宏:
printf("%d",ab+"b");
您取整數(20),並將其用於字符串文字的指針運算。實際上過去了文字的末尾,從而導致了未定義的行爲。
'ab'具有值'20',而不是'150'。它被添加到一個指針,不用作索引。 – Peter
@彼得 - 回答遲到讓人覺得'ab'是'a * b'。更正了,謝謝。 – StoryTeller
c宏定義'#'和'##'操作 –