两个代码相同的程序:浮点溢出 我使用DEV C++。 只是面临一个非常奇怪的问题

两个代码相同的程序:浮点溢出 我使用DEV C++。 只是面临一个非常奇怪的问题,c++,c,loops,floating-point,initialization,C++,C,Loops,Floating Point,Initialization,首先,我复制了运行良好的程序代码 #include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> #define f(x) 0.2027*sqrt(1-x*x) int main() { int k=0; //<----the change is here float x,y,c,z; c=0.6366198; do {

首先,我复制了运行良好的程序代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>

#define f(x) 0.2027*sqrt(1-x*x)

int main()
{
    int k=0;   //<----the change is here 
    float x,y,c,z;

    c=0.6366198;
    do {

        x=2*(rand()/(float)RAND_MAX)-1;                          

        z=rand()/(float)RAND_MAX;
        y=y*2*c;

        if (y<=f(x)) {
            printf("%f\t",x);
            k=k+1;
        }
    } while(k<=100);         // <--the change is here 

    getchar();
}
#包括
#包括
#包括
#包括
#定义f(x)0.2027*sqrt(1-x*x)
int main()
{

int k=0;//正如我在代码中看到的那样

 y=y*2*c;
y
未初始化使用。作为一个自动局部变量,初始值是不确定的。因此,两个代码都调用

引用本标准第§6.7.9章初始化

如果没有显式初始化具有自动存储持续时间的对象,则其值为 不确定。[…]

对于未定义的行为,附录§J.2

具有自动存储持续时间的对象的值将在其运行时使用 不确定

您需要初始化自动局部变量,如

float x = 1, y = 2, c = 3, z = 4;  //values are for example purpose
等等


故事的寓意:请打开编译器警告并注意它们。

在这两种情况下,
y
在未初始化的情况下使用:

float x,y,c,z;
y=y*2*c;

这会导致未定义的行为,编译器应该对此发出警告(因此确保警告处于打开状态,最好是处于最高级别).

谢谢,但是为什么第一个程序要运行呢?我从来没有用这种方式初始化过变量。我只写float:x,y,z;但是是的,@sourav ghosh,现在第二个程序运行得很好。但是,如果你能解决我的问题的话!@NathanOliver这只是一个例子,但我明白你的意思。编辑并添加了一条注释以澄清混淆。谢谢s:)另外,int main()需要返回一个值。不需要。如果在return语句之前到达main的末尾,则使用隐式
return 0;
。@NathanOliver只是为了添加,
还有int main()需要返回一个值。< /代码>。如果你不给出一个值,那么隐式0将返回。):NaNaOLVER -你是对的,在这里得到警告,但是编译器仍然被设置为C++。谢谢。更新。谢谢。@ SuravgHoh我读到了,因为他们说返回声明是必要的,我想说实际上不需要。@ NathanOli。ver,@SouravGhosh-返回值是C89/C90所必需的。我认为将其包括在内是一种良好的做法,尤其是当可以访问结束
}
时。
float x,y,c,z;
y=y*2*c;