程序调试的结果和输出的结果不一样

来源:百度知道 编辑:UC知道 时间:2024/06/27 11:02:48
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#define gpj n/(n+1)
#define zpj 0.5
#define dpj 1/(n+1)
#define gpr 1/(n+1)
#define zpr 0.5
#define dpr n/(n+1)
#define p1 0.2
#define p2 0.6
#define ps n/(n+1)
void main()
{
int i,r,j;
int n=1;
for(i=0;i<10;i++)
{
srand((unsigned)time(NULL));
r=rand()%100;
if(r<100*p1)
{
srand((unsigned)time(NULL));
j=rand()%100;
if(j>100*ps)
n=n;
else
{
if(j<(100*gpj*ps))
{
if(n>=1)n=n-1;
else n=0;
}
else n=n+1;
}
}
if(r>=(100*p1)&&r<=(100*(p1+p2)))
{
srand((unsigned)time(NULL));
j=rand()%100;
if(j>100*ps)
n=n;
else
{
if(j<(100*zpj*ps))
{
if(n>=1)n=n-1;
else n=0;
}

#define来定义宏的时候要注意最好把宏中的参数分别用括号括起来,如#define gpj n/(n+1) 应写成#define gpj ((n)/(n+1)),否则有可能导致错误。楼主的就是这样导致的。
因为用#define定义宏仅仅只是一个替换,如程序中if(j>100*ps) ,如果按楼主定义的话编译时会替换为if(j<(100*n/(n+1)))这句实际上跟楼主的意思有差别。楼主希望先算n/(n+1)的值,再与100相乘,但实际上是先100与n相乘,再除以(n+1),因为两个int型做除法时结果会取整,因此这两种算法的结果可能不一样。其他宏定义也类似。
将宏定义写成#define gpj ((n)/(n+1))这种形式后,在调试就可以看到,调试结果和输出结果是一样的了。