gpt4 book ai didi

ios - 在 C 语言中默认初始化的基本类型是什么?

转载 作者:可可西里 更新时间:2023-11-01 03:23:01 24 4
gpt4 key购买 nike

我刚刚让 Apple 的 C/C++ 编译器将 float 初始化为非零值(大约“-0.1”)。

这是一个很大的惊喜 - 只是偶尔发生(但 100% 可重复,如果你事先运行相同的函数调用/args)。花了很长时间来追踪(使用断言)。

我以为 float 是零初始化的。谷歌搜索表明我在考虑 C++(当然这对这些东西更精确 - c.f. SO: What are primitive types default-initialized to in C++?)。

但也许 Apple 的借口是他们的编译器在 C 模式下运行……所以:C 怎么样?应该发生什么,以及(更重要的)什么是典型的?

(当然我应该手动初始化它 - 我通常会这样做 - 但在这种情况下我失败了。不过我没想到它会爆炸!)

(事实证明,谷歌对此的任何讨论都比无用更糟糕 - 他们当前的搜索拒绝显示没有“C++”的“C”。一直认为我太愚蠢,甚至在高级模式下运行时甚至忽略我的输入)


这是它发生的实际来源示例。起初我以为 MAX 和 ABS 的定义可能有问题(也许 MAX(ABS,ABS) 并不总是按照您的预期进行?)......但是通过断言和调试器进行挖掘,我最终发现它丢失了初始化 - float 偶尔会被初始化为非零值):

float crossedVectorX = ... // generates a float
float crossedVectorY = ... // generates a float

float infitesimal; // no manual init
float smallPositiveFloat = 2.0 / MAX( ABS(crossedVectorX), ABS(crossedVectorY));

// NB: confirmed with debugger + assertions that smallPositiveFloat was always positive

infitesimal += smallPositiveFloat;

NSAssert( infitesimal >= 0.0, @"This is sometimes NOT TRUE" );

最佳答案

如果没有显式初始化程序,则只有具有静态存储持续时间的对象才会初始化为 0

#include <stdio.h>

float f; // initialized to 0, file scope variables have static storage
static float g; // initialized to 0

int main(void)
{
float h; // not initialized to 0, automatic storage duration
static float i; // initialized to 0

return 0;
}

没有显式初始化的具有自动存储持续时间的对象(如上例中的 h)具有不确定的值。读取它们的值是未定义的行为。

编辑:为了完整起见,如果没有显式初始化器,具有线程存储持续时间的 C11 对象也被初始化为 0

关于ios - 在 C 语言中默认初始化的基本类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10089551/

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