mooney2001 发表于 2016-5-13 17:32:39

带你学C带你飞第15课 课后练习问题

带你学C带你飞第15课
课后练习第4题,题目是:请写出每行代码执行后,result的值。
double result = 1.0;
result += 2.6;
result ++;
result * 5;
result = (int)(result + 0.5)

写了如下的代码进行验证
#include <stdio.h>

int main()
{
      double result = 1.0;
      printf ("result0=%f\n",result);

      result += 2.6;
      printf ("result1=%f\n",result);

      result ++;
      printf ("result2=%f\n",result);

      result = result * 5;
      printf ("result3=%f\n",result);

      result = (int)(result + 0.5);
      printf ("result4=%i\n",result);

      return 0;
}

问题是,上面代码执行后,result4的值一直不对,每次运行都有不同的结果,请高手指点!

人造人 发表于 2016-5-13 18:49:02

result = (int)(result + 0.5);
      printf ("result4=%i\n",result);

%i 什么情况?

n0noper 发表于 2016-5-14 09:48:38


还没有注意过这个问题···
刚才调试了一下,结果跟楼主的不一样:总是输出0 (无论VC还是CodeBlocks)

简单解析:result操作之后,依然是23.0000 然后输出的时候,参数入栈是按照double型压入,所以为8字节,然而%i只取4个字节,所以··· 按照double的编码和内存中的存储方式,就是0了

卤煮这种问题应该可以自己调试出来,如果调试不熟悉,参考:http://bbs.fishc.com/thread-71753-1-1.html

以上绝对没有广告嫌疑i!{:10_256:}

mooney2001 发表于 2016-5-14 11:13:11

n0noper 发表于 2016-5-14 09:48
还没有注意过这个问题···
刚才调试了一下,结果跟楼主的不一样:总是输出0 (无论VC还是CodeBlocks)
...

谢谢版主耐心解答,马上试试!!

mooney2001 发表于 2016-5-14 11:14:04

人造人 发表于 2016-5-13 18:49
result = (int)(result + 0.5);
      printf ("result4=%i\n",result);



%i和%d一样都是占位符,整型数据用这个占位符与%d一样的效果。

人造人 发表于 2016-5-14 18:38:29

mooney2001 发表于 2016-5-14 11:14
%i和%d一样都是占位符,整型数据用这个占位符与%d一样的效果。

#include <stdio.h>

int main()
{
      double result = 1.0;
      printf ("result0=%f\n",result);

      result += 2.6;
      printf ("result1=%f\n",result);

      result ++;
      printf ("result2=%f\n",result);

      result = result * 5;
      printf ("result3=%f\n",result);

      result = (int)(result + 0.5);
      printf ("result4=%i\n",result);

      return 0;
}

最后一个输出为什么用 %i

mooney2001 发表于 2016-5-15 08:00:28

人造人 发表于 2016-5-14 18:38
#include

int main()


前面是double型数据,要用%f占位符,最后一个已经是整型数据了呀,要用%i或%d占位符。

人造人 发表于 2016-5-15 20:53:52

mooney2001 发表于 2016-5-15 08:00
前面是double型数据,要用%f占位符,最后一个已经是整型数据了呀,要用%i或%d占位符。

result = (int)(result + 0.5);

(int)(result + 0.5);
的确转换成了整型

但是result 是 double 类型
你把转换后的整型又赋值给 result
result 的类型是double
不会变,你改变的只是  result = (int)(result + 0.5); 
红色的那部分

人造人 发表于 2016-5-15 20:58:10

mooney2001 发表于 2016-5-15 08:00
前面是double型数据,要用%f占位符,最后一个已经是整型数据了呀,要用%i或%d占位符。

当然你可以这样
result = (int)(result + 0.5);
printf ("result4=%i\n", (int)result);
不过这好像没有意义
页: [1]
查看完整版本: 带你学C带你飞第15课 课后练习问题