c - 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);
}
我已经编写了上面的程序来计算给定半径的圆的面积,但是我得到了非常奇怪的值,我不知道为什么。
解决方案
问题是您使用整数格式说明符%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 的二进制补码),因此最终会得到您描述的确切症状。
当然,作为未定义的行为,可能发生的其他事情之一是因果关系的完全崩溃,然后是宇宙的完全毁灭:-)
而且,是的,这有点夸张,但它是为了强调依赖未定义的行为是多么糟糕。显然,后果不会真的那么糟糕,但假设它们会是一个好主意。
推荐阅读
- php - Select array values based on another array
- c# - 挑战在 C# 中编写泛型函数
- android - Xamarin.Android - 不显示对话框
- websocket - 当服务器关闭时,Websocket plus plus 连接调用崩溃
- django - 如何在 Django 中访问反向名称 = '+' 的字段?
- javascript - JSONify returning strange values
- android - When using Theme.MaterialComponents.Light.NoActionBar style, setting Button Background has no effect
- php - File upload message succes but no file into folder
- debugging - Fortran输出NaN的所有情况是什么?
- sql - T-SQL - How to convert SELECT statements stored in table cells to a result?