Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么两个代码的输出不同_C++ - Fatal编程技术网

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编译并运行代码,则不会再看到警告。