C++ 为什么两个代码的输出不同
这两种代码不同吗? 如果是的话,怎么办? 如果不是,那么为什么相同的代码给出不同的答案 //C++ 为什么两个代码的输出不同,c++,C++,这两种代码不同吗? 如果是的话,怎么办? 如果不是,那么为什么相同的代码给出不同的答案 // #包括 #包括 使用名称空间std; #定义PI 3.14 虚无乐趣(){ printf(“%f\n”,PI); } int main(){ printf(“%f\n”,PI); #定义PI 3.141528 乐趣(); } 3.140000 3.140000 // #包括 #包括 使用名称空间std; #定义PI 3.14 虚无乐趣(); int main(){ printf(“%f\n”,PI);
#包括
#包括
使用名称空间std;
#定义PI 3.14
虚无乐趣(){
printf(“%f\n”,PI);
}
int main(){
printf(“%f\n”,PI);
#定义PI 3.141528
乐趣();
}
3.140000
3.140000
//
#包括
#包括
使用名称空间std;
#定义PI 3.14
虚无乐趣();
int main(){
printf(“%f\n”,PI);
#定义PI 3.141528
乐趣();
}
虚无乐趣(){
printf(“%f\n”,PI);
}
3.140000
3.141528
还是预处理器指令的问题?
#define
声明预处理器宏。只要宏PI
出现在#define PI 3.14
之后的代码中,预处理器就会将其改为3.14
。在第一段中,您将其定义为3.14
,预处理器将其扩展到所有位置。更改PI
的定义后,任何地方都没有提到它,因此预处理器从未将其扩展到新定义。但是,在第二个块中,预处理器仍然将第一个PI
扩展为3.14
,但是现在在重新定义后出现了第二个PI
,它将其扩展为3.141528
。\define
声明了一个预处理器宏。只要宏PI
出现在#define PI 3.14
之后的代码中,预处理器就会将其改为3.14
。在第一段中,您将其定义为3.14
,预处理器将其扩展到所有位置。更改PI
的定义后,任何地方都没有提到它,因此预处理器从未将其扩展到新定义。但是,在第二个块中,预处理器仍然将第一个PI
扩展到3.14
,但是现在PI
的第二次出现在重新定义之后,它将其扩展到3.141528
。好问题,当然它们确实不同。
据我所知,使用“#define”定义的常量的范围是从它定义的行开始的(直到重新定义或未定义,否则直到代码结束)。
在第一个程序中,新PI仅在其后两行重新定义和识别:
...
#define PI 3.141528
fun();
}
...
#define PI 3.141528
fun();
}
void fun()
{
printf("%f\n",PI);
}
但在第二个版本中,它被重新定义并在后面的6行中标识:
...
#define PI 3.141528
fun();
}
...
#define PI 3.141528
fun();
}
void fun()
{
printf("%f\n",PI);
}
它包含了乐趣的主体()。因此,在body of fun()中,新常量(3.141528)将有效并应用。好问题,当然它们确实不同。 据我所知,使用“#define”定义的常量的范围是从它定义的行开始的(直到重新定义或未定义,否则直到代码结束)。 在第一个程序中,新PI仅在其后两行重新定义和识别:
...
#define PI 3.141528
fun();
}
...
#define PI 3.141528
fun();
}
void fun()
{
printf("%f\n",PI);
}
但在第二个版本中,它被重新定义并在后面的6行中标识:
...
#define PI 3.141528
fun();
}
...
#define PI 3.141528
fun();
}
void fun()
{
printf("%f\n",PI);
}
它包含了乐趣的主体()。因此,在fun()的主体中,新常量(3.141528)将有效并应用。如果您对此投票不赞成,请发表评论并说明理由。没有任何评论的否决投票是没有意义的。仔细检查你的代码并用你定义的值替换
PI
,就像预处理器所做的那样。不难理解发生了什么。你的编译器应该在第二个#define
上给你一个警告。不,我只使用了ideone,没有发出警告there@T.C.如果Ideone编译并运行代码,您将不再看到警告。如果您对此投反对票,请发表评论并说明原因。没有任何评论的否决投票是没有意义的。仔细检查你的代码并用你定义的值替换PI
,就像预处理器所做的那样。不难理解发生了什么。你的编译器应该在第二个#define
上给你一个警告。不,我只使用了ideone,没有发出警告there@T.C.如果Ideone编译并运行代码,则不会再看到警告。