解释一个中期C ++的例子

时间:2013-05-09 07:38:01

标签: c++

我的老师刚刚将此作为即将到来的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的情况。我一直在尝试不同的数字一小时,我无法确切地知道如何计算。

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

你有

#define foo1( a )  a * a

因此,当您说foo1( 3 + 2 )时,编译器会看到3 + 2 * 3 + 2。显然是11

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

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

答案 2 :(得分:2)

因为宏被抨击为:

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

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

答案 3 :(得分:0)

foo1是一个定义为foo1(a) a * a的宏。

所有#define语句都是C-preprocessor宏语句。在任何编译发生之前,它们都会被扩展为代码。

所以

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

希望你玩得开心

答案 4 :(得分:0)

类似函数的宏按direct text substitution

工作

因此foo1(3+2)变为(3 + 2*3 + 2),即11