首页 > 解决方案 > c程序计算圆的面积

问题描述

#include<stdio.h>

int main() {
   float radius, area;

   printf("\nEnter the radius of Circle : ");
   scanf("%d", &radius);

   area = 3.14 * radius * radius;
   printf("\nArea of Circle : %f", area);

   return (0);
}

我已经编写了上面的程序来计算给定半径的圆的面积,但是我得到了非常奇怪的值,我不知道为什么。

标签: c

解决方案


问题是您使用整数格式说明符%d扫描float到点变量radius。这实际上是未定义的行为(a),您应该使用它%f来扫描float变量。

该标准明确指出这是一项要求(以下引述摘自C11 7.21.6.2 The fscanf function /12,并且 C++ 遵循 C 标准来处理此类遗留内容):

a,e,f,g- 匹配可选带符号的浮点数、无穷大或 NaN,其格式与strtod 函数主题序列的预期格式相同。相应的参数应该是一个指向浮动的指针。


当然,如果这是一个 C++ 问题,最好使用来自iostream而不是stdio/cstdio. C++ 的类型安全通常会避免这个问题,因为行为会适应类型,而不是您必须手动指定事物。

这可以像这样简单:

float radius;
std::cout << "\nEnter the radius of Circle : ";
std::cin >> radius;

(a)可能发生的事情之一是scanf愉快地将整数放入存在浮点值的内存中。不幸的是,他们倾向于使用不同的编码方案(例如针对单精度 IEEE754 的二进制补码),因此最终会得到您描述的确切症状。

当然,作为未定义的行为,可能发生的其他事情之一是因果关系的完全崩溃,然后是宇宙的完全毁灭:-)

而且,是的,这有点夸张,但它是为了强调依赖未定义的行为是多么糟糕。显然,后果不会真的那么糟糕,但假设它们会是一个好主意。


推荐阅读