3

我的老师刚刚给出了这个作为即将到来的 C++ 期中考试的几个程序示例之一。代码是:

//What does this program print?

#include <iostream>
using namespace std;

#define foo1( a )  a * a

int j = 6;

inline  int
foo2( int a ) 
{
    return a * a;
}

void
goo1( int& x )
{
    x = 3;
}

void
goo2( int  x )
{
    x = 3;
}

int main()
{
    int i, j = 12;

    cout << "foo1 = " << foo1( 3 + 2 ) << "\n";
    cout << "foo2 = " << foo2( 3 + 2 ) << "\n";

    i = 5;
    goo1( i );
    cout << "goo1 = " << i << "\n";
    i = 5;
    goo2( i );
    cout << "goo2 = " << i << "\n";

    cout << "  j = " <<   j << "\n";
    cout << "::j = " << ::j << "\n";
}

有人可以解释一下 foo1 = 11 是如何计算的吗?我已经用不同的数字试验了一个小时,但我无法准确理解它是如何计算的。

4

5 回答 5

8

foo1 是一个宏。宏执行严格的查找和替换,因此 foo1(3+2) 被替换为 3+2*3+2。按照运算顺序,3+2*3+2 = 3+6+2 = 11。

于 2013-05-09T07:41:11.300 回答
2

你有

#define foo1( a )  a * a

所以当你说的时候foo1( 3 + 2 ),编译器会看到3 + 2 * 3 + 2. 明显地11

如果你想让宏foo1做乘法,你应该

#define foo1(a) ((a)*(a))
于 2013-05-09T07:41:40.710 回答
2

因为宏被敲出来是这样的:

cout << "foo1 = " << 3 + 2 * 3 + 2 << "\n";

简单的 BODMAS 告诉我这等于 11 :) 即 3 + (2 * 3) + 2

于 2013-05-09T07:41:53.893 回答
0

foo1 是一个定义为 foo1(a) a * a.

所有#define语句都是 C 预处理器宏语句。在进行任何编译之前,它们实际上会扩展为代码。

所以

#define foo1(a) a * a

变化

cout << "foo1 = " << foo1( 3 + 2 ) << "\n";

cout << "foo1 = " << 3 + 2 * 3 + 2 << "\n";

由于扩展中 a 周围没有括号,因此评估为 11

如果您想看到它按照您期望的方式工作(即最终成为 25 岁),您可以尝试如下定义:

#define foo1(a) (a) * (a) 

你会看到它最终是 25

此外,您应该能够通过使用正确的编译器选项来查看预处理器输出。对于 gcc 或 g++ 它是 -E ...

希望你玩得开心

于 2013-05-09T07:48:12.820 回答
0

类似函数的宏通过 直接文本替换工作

所以foo1(3+2)变成(3 + 2*3 + 2)了 11

于 2013-05-09T07:52:49.570 回答