在C/C++中,为什么要使用abs()fabs()来查找变量的绝对值,而不使用以下代码?

int absoluteValue = value < 0 ? -value : value;

是否与较低层次的指令较少有关?

推荐答案

对于浮点数,您建议的"条件abs"不等于std::abs(或fabs),请参见.

#include <iostream>
#include <cmath>

int main () {
    double d = -0.0;
    double a = d < 0 ? -d : d;
    std::cout << d << ' ' << a << ' ' << std::abs(d);
}

输出:

-0 -0 0

假设-0.00.0代表相同的实数"0",这个差异可能重要,也可能不重要,这取决于结果的使用方式.然而,IEEE754指定的abs函数要求结果的符号位为0,这将禁止结果为-0.0.我个人认为任何用来计算"绝对值"的东西都应该符合这种行为.

对于整数,这两个变量在运行时和行为上都是等效的.(Live example)

但由于std::abs(或合适的C类似功能)被认为是正确且易于阅读的,所以你应该总是更喜欢那些.

C++相关问答推荐

如何将已分配的数组(运行时已知的大小)放入 struct 中?

为什么在C中进行大量的位移位?

显式地将值转换为它从函数返回的类型的含义是什么?

将指针作为参数传递给函数

如果我释放其他内容,返回值就会出错

struct -未知大小

&;(str[i])和(&;str)[i]有什么区别?

在句子中转换单词的问题

为什么指针运算会产生错误的结果?

C语言中的外部关键字

通过k&;r语法的c声明无效

Makefile无法将代码刷新到ATmega328p

将size_t分配给off_t会产生符号转换错误

如果类型是新的,offsetof是否与typeof一起工作?

在我的第一个C语言中观察到的错误';你好世界';程序

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

是什么阻止编译器优化手写的 memcmp()?

创建 makefile 来编译位于不同目录中的多个源文件

在 C/C++ 中原子按位与字节的最佳方法?

读取包含指向列表的指针的段寄存器 (%gs)