gpt4 book ai didi

c - 在 C 中,是否可以?增加一个未初始化的整数?

转载 作者:太空狗 更新时间:2023-10-29 17:16:05 24 4
gpt4 key购买 nike

根据 this SO answer ,在 C 中递增未初始化的 int 会导致未定义的行为。但是,如果我根本不关心初始值怎么办?例如,如果我只想要一个递增的 id 怎么办?这是危险的还是不好的做法

最佳答案

如果访问具有自动存储期限 的对象的值,并且该对象未初始化,则行为未定义。这在 N1570 中有明确和正式的说明。 6.3.2.1 第 2 段(这是 ISO C 标准的最新公开草案)。

未定义的行为”不仅仅意味着您可能获得任意值。它表示“使用不可移植或错误的程序构造或错误数据时的行为,本国际标准对此没有强加任何要求”(N1570 3.4.3)。语言标准几乎没有说明访问此类对象的值意味着什么。这实际上是纯粹的胡言乱语。 (标准的笑话是未定义的行为会导致恶魔从你的 Nose 里飞出来。当然在现实生活中它不能——但如果是这样你就不能提示编译器不符合规范。)

但让我们暂时忽略访问未初始化的 int 的未定义行为。也许你今天感觉很幸运。也许您知道您的编译器将如何处理这种情况。

更准确地说,让我们对未定义的行为如何表现做出一些合理的假设。

假设我们有:

int i;
i ++;

假设 i 的(未定义)初始值恰好是 INT_MAX。然后递增 i 会导致有符号整数溢出,这又是明确未定义的行为(N1570 6.5 第 5 段)。即使初始值小于 INT_MAX,将其递增足够多次也会导致溢出——而且由于您不知道初始值是多少,因此您不知道可以递增多少次“安全地”增加它。

最可能的不良后果是,优化编译器将根据其行为已定义的假设 来转换代码。这是一个不涉及未初始化变量的示例:

int i = INT_MAX;
int j = i + 1;
if (j > i) { /* ... */ }

如果加法遵循常见的环绕 2 的补码语义(C 标准保证,但通常在硬件中实现),那么 j 将是等于 INT_MIN(j > i) 将为假。从逻辑上讲,(j > i) 必须 为假,因为 int 值不能超过 INT_MAX。但是由于 j 被设置为 i + 1,因此 (j > i) 必须 为真(对于任何具有定义行为的程序)。

无论您对此代码的行为有何期望,优化编译器都可能合法地违反它们。如果幸运的话,它可能会在破坏您的代码之前警告您,但这不是必需的。

与我们讨论如果不这样做会发生什么情况相比,您在 i 的声明中添加 = 0 所花费的时间要少得多。 (但即便如此,如果您将 i 递增到足以导致溢出的次数,您也可能会遇到问题。)

关于c - 在 C 中,是否可以?增加一个未初始化的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28270914/

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