#include <stdio.h>
#define dprintf(expr) printf(#expr "=%d\n",expr)
int main()
{
int x=7;
int y=3;
dprintf(x/y);
return 0;
}
我得到输出为 x/y=2 我很困惑如何打印“x/y”
#include <stdio.h>
#define dprintf(expr) printf(#expr "=%d\n",expr)
int main()
{
int x=7;
int y=3;
dprintf(x/y);
return 0;
}
我得到输出为 x/y=2 我很困惑如何打印“x/y”
在宏中,将操作数#
字符串化,因此#expr
将获取参数并将它们转换为字符串,并且由于相邻的字符串文字被连接起来,因此它将被连接起来,"=%d\n"
因此您最终得到:
printf( "x/y" "=%d\n",expr)
这将成为:
printf( "x/y=%d\n",expr)
从草案C99 标准草案部分的完整起见,6.10.3.2
# 运算符第2段涵盖了#
它相当长且难以阅读,所以我不会引用它,但部分5.1.1.2
翻译阶段第6段说:
连接相邻的字符串文字标记
dprintf(x/y);
扩展到
printf("x/y" "=%d\n", x/y);
评估为:
printf("x/y" "=%d\n", 7 / 3);
现在因为 x 和 y 是整数,所以 x/y 的结果是 2(整数)
所以输出是x/y=2
请注意,c 预处理器 # 指令将 #expr 替换为“expr”。
另请注意,c 编译器将简单地将相邻的字符串文字连接成一个字符串,即printf("Hello " "World\n");
相当于printf("Hello World\n");
有关详细信息,请参阅http://gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification 。