这两个代码有什么不同吗? 如果有,那怎么样? 如果没有,那么为什么相同的代码给出不同的答案?
// 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
或者它是预处理程序指令的问题吗?
答案 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)将有效并应用。