【问题标题】:What is the best implementation of min? [closed]min 的最佳实现是什么? [关闭]
【发布时间】:2019-08-28 09:12:56
【问题描述】:

有没有区别

int min(int a, int b) {
    return (a < b) ? a : b;
}

和

int min(int a, int b) {
    return (b < a) ? b : a;
}

有什么特别的理由偏爱其中一个吗?

此问题专门针对 C 和 C++ 语言。我知道这些是不同的语言,这里对 C++ 提出了类似的问题:Correct implementation of min。

我对可能与一种语言而不是另一种语言有关的原因感兴趣。

【问题讨论】:

标签: c++ c language-lawyer min


【解决方案1】:

不,没有。这两种实现在所有定义的情况下都是等效的。 (单个编译器可能会表现出性能差异,但不会出现功能差异。)

如果函数不仅仅与整数有关,情况会有所不同。正如 chux 在评论中提到的那样,浮点数可以同时具有 a&lt;b 和 b&lt;a 假,即使它们的位模式不同,例如负/正零,或者至少一个是 NaN。从技术上讲,这也可能发生在奇异(但符合标准)整数表示(通过 -0 或填充位)的情况下,但 AFAIK 没有其他符合标准的编译器这样做。

【讨论】:

  • 填充位不会影响值,因此它们不会影响a&lt;b 或b&lt;a 的评估。 -0 不会导致 a&lt;b 和 b&lt;a 都为假;它应该像零一样。如果a 或b 是陷阱表示,那么a&lt;b 或b&lt;a 将陷入陷阱,C 标准对此没有提供任何帮助。
  • Unisys 仍然支持a C compiler for its legacy OS-2200 mainframes,它使用补码有符号整数并声称符合 C89。
  • @EricPostpischil 我的想法是,仍然可以通过类型双关语读取未捕获的填充位,如果值匹配,则暴露行为差异。但经过反思,我认为标准不能保证与所选操作数中存在的对象表示形式相同。
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多