我正在使用DEV c ++。 并且只是面临一个非常奇怪的问题。
首先,我复制了运行正常的程序代码。
#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();
}
如果我稍微更改while条件以使程序更通用,那么在DEVc ++中没有任何事情发生。我只看到一个“空白页面”;
#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,t=100; //<----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<=t); // <--the change is here
getchar();
}
在turboc ++中,同样的事情正在发生。它不是显示像Devc ++这样的空白页面,而是显示浮点溢出。为什么?
答案 0 :(得分:3)
我可以在你的代码中看到
y=y*2*c;
y
未初始化使用。作为自动局部变量,初始值是不确定的。因此,您的两个代码都会调用undefined behavior。
引用标准,章节§6.7.9,初始化
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不定。 [...]
,对于未定义的行为,附件§J.2
使用具有自动存储持续时间的对象的值 不确定
您需要初始化自动局部变量,例如
float x = 1, y = 2, c = 3, z = 4; //values are for example purpose
等等。
故事的道德:请打开编译器警告并注意它们。
答案 1 :(得分:0)
在这两种情况下,y
都在没有初始化的情况下使用:
float x,y,c,z;
y=y*2*c;
这会导致未定义的行为,并且编译器应该警告(因此请确保警告已打开,最好是在最高级别)。