这个c程序是如何评估的

时间:2013-09-19 16:09:08

标签: c

#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”

2 个答案:

答案 0 :(得分:4)

在宏中,# stringifies操作数使得#expr将获取参数并将它们转换为字符串,并且由于相邻的字符串文字被连接,因此它将被连接到{ {1}}所以你最终得到:

"=%d\n"

将成为:

printf( "x/y" "=%d\n",expr)

完整起见草案C99 draft standard部分printf( "x/y=%d\n",expr) #运算符 2 涵盖6.10.3.2它相当长并且难以阅读所以我不会引用它但是# 翻译阶段 6 表示:

  

相邻的字符串文字标记是连接的

答案 1 :(得分:0)

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