为什么两个代码给出不同的输出

时间:2014-06-19 18:59:15

标签: c++

这两个代码有什么不同吗? 如果有,那怎么样? 如果没有,那么为什么相同的代码给出不同的答案?

// code 1

#include<iostream>
#include<cstdio>

using namespace std;

#define PI 3.14

void fun() {
    printf("%f\n",PI);
}

int main() {
    printf("%f\n",PI);
    #define PI 3.141528
    fun();
}

3.140000

3.140000

// code 2

#include<iostream>
#include<cstdio>

using namespace std;

#define PI 3.14

void fun();

int main() {
    printf("%f\n",PI);
    #define PI 3.141528
    fun();
}

void fun() {
    printf("%f\n",PI);
}

3.140000

3.141528

或者它是预处理程序指令的问题吗?

2 个答案:

答案 0 :(得分:4)

#define声明一个预处理器宏。只要宏PI出现在#define PI 3.14之后的代码中,预处理器就会将其更改为3.14。在您的第一个细分中,您已将其定义为3.14,并且预处理器会将其扩展到任何位置。更改PI的定义后,在任何地方都没有提及它,因此预处理器永远不会将其扩展到新定义。但是,在第二个块中,预处理器仍会将第一个PI扩展为3.14,但现在在重新定义后第二次出现PI时,它会将其扩展为3.141528而是。

答案 1 :(得分:1)

好问题,当然他们确实有所不同。 据我所知,使用&#34; #define&#34;定义常量的范围。是从它向前定义的行(直到重新定义或未定义,否则直到代码结束)。 在第一个程序中,新的PI被重新定义并在其后仅识别两行:

...
#define PI 3.141528
fun();
}

但是在第二个版本中,它被重新定义并在其之后标识为6行:

...
#define PI 3.141528
fun();
}

void fun()
{
printf("%f\n",PI);
}

它包括乐趣的主体()。因此,在fun()的主体中,新常量(3.141528)将有效并应用。