gpt4 book ai didi

c - 具有浮点输入和输出值的简单 C 代码的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 08:30:57 24 4
gpt4 key购买 nike

我无法解释这种行为:从两个不同的位置调用具有相同输入参数的相同函数会给出两个不同的答案。但它不应该!

在某些情况下, float 结果为 0,我无法解释原因。

这是一段简单的代码:

#include <stdio.h>

void main(int argc, char** argv)
{
bar((1.0/16)); //prints input
foo(); //calls bar((1.0/16));
}

void bar(float x){
printf("%f\n",x);
}

void foo(){
bar((1.0/16));
}

这是它的输出:

0.000000
0.062500
  • 这仅发生在 float 类型参数和 1.0/16 值时。
  • intunsigned int 类型参数和 16 值完全没有问题。
  • float 类型参数和 16 完全没有问题。值(value)。

所以只有当我同时使用浮点类型和浮点值时才会出现问题。

所有这些都发生在装有 Visual Studio 2010 SP1 的 Windows 7 64 位计算机上。只有我在项目属性中更改的设置:

  • 结构成员对齐:1 字节。
  • 禁用语言扩展:是
  • 编译为:编译为C代码

配置:调试。平台:win32。

有什么想法吗?

非常感谢。

最佳答案

这是因为在你第一次从 main 调用它之前你没有 bar 的原型(prototype),所以编译器会尝试猜测函数的参数类型有,当你向它传递一个 double 参数时(1.0/16double 类型)它会传递一个 double 值到一个函数,它实际上接受一个 float 参数。参数不匹配导致 undefined behavior .

有两种方法可以解决这个问题:

  1. 在调用函数之前声明函数(编写原型(prototype))。
  2. 将参数类型更改为double

我推荐列表中的第一个。

float 值传递给函数(例如 1.0f/16),因为对于隐式声明的函数,如你的参数被提升为默认类型,对于浮点值是 double。另请注意,隐式声明的函数应返回 int

关于c - 具有浮点输入和输出值的简单 C 代码的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26930076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com