为什么“使用命名空间std;”在C++中处理双打时给出不同的结果?

今天,我在尝试回答这个帖子(关于检查是否可以构造三角形)时,遇到了一个奇怪的结果。

经测试15.15 35.77 129.07,这段代码:

#include <iostream>
using namespace std;

const double e = 0.000001;

void f(double a, double b, double c)
{
    if (abs(180 - (a+b+c)) > e) {cout << "test"; }
}

int main()
{
    double a,b,c; cin >> a >> b >> c;
    f(a,b,c);
}

test正常打印,而这个:

#include <iostream>
const double e = 0.000001;

void f(double a, double b, double c)
{
    if (abs(180 - (a+b+c)) > e) {std::cout << "test"; }
}

int main()
{
    double a,b,c; std::cin >> a >> b >> c;
    f(a,b,c);
}

才不是。唯一的区别是using namespace std;行(当我添加using namespace std;到第二段代码时,正如预期的那样,它正常运行)。

我已经阅读了很多关于using namespace std;随着时间的推移的帖子:

  • 使用命名空间标准
  • 为什么是“使用命名空间 std;” 被认为是不好的做法?
  • ...

但似乎唯一using namespace std;要做的就是偷工减料,以换取类/变量/命名空间的名称偶尔发生冲突(这是讨论是否使用它时最常提到的一点)。

我确实找到了 1 个相关帖子:为什么 g++ (4.6 和 4.7) 将此除法的结果提升为两倍?我能阻止吗?,但我没有在其他地方找到更多信息。

那么我在这里错过了什么?

-- 一些机器信息:

  • Windows 10,64 位
  • 代码::块 20.03
  • gcc/g++ 6.3.0

回答

确实存在名称冲突:int abs(int)double std::abs(double).

使用using namespace std;,abs(180 - (a+b+c))找到两者并且std::abs是更好的匹配。

没有using namespace std;,abs(180 - (a+b+c))只能找到前者并且需要转换为int,因此观察到的行为。

你真正想要的是:

#include <iostream>
const double e = 0.000001;

void f(double a, double b, double c)
{
    if (std::abs(180 - (a+b+c)) > e) {std::cout << "test"; }
}

int main()
{
    double a,b,c; std::cin >> a >> b >> c;
    f(a,b,c);
}

  • Note that you can also use `std::fabs` to explicitly document your intention NOT to use the integer version.

以上是为什么“使用命名空间std;”在C++中处理双打时给出不同的结果?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>