为什么 "using namespace std;" 在处理 C++ 中的双打时给出不同的结果?
Why "using namespace std;" gives different result when dealing with doubles in C++?
今天想回答this post(关于判断是否可以构造三角形),遇到奇怪的结果
经过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;
的 post:
- Using Namespace std
- Why is "using namespace std;" considered bad practice?
- ...
但似乎 using namespace std;
唯一做的就是偷工减料,以换取 classes/variables/namespaces 名称偶尔的冲突(争论是否使用时提到最多的一点)它)。
我确实找到了 1 个相关的 post : Why does g++ (4.6 and 4.7) promote the result of this division to a double? Can I stop it? ,但我在其他地方找不到更多信息。
那么我在这里缺少什么?
-- 一些机器信息:
- Windows 10、64 位
- 代码::块 20.03
- gcc/g++ 6.3.0
那是因为你还没有将std::
添加到abs()
,因此编译器并不知道它是什么功能,ergo UB。它很可能已经找到并使用了 C 版本的函数,该函数是为 int
个参数创建的。
您 有名称冲突:int abs(int)
versus 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);
}
今天想回答this post(关于判断是否可以构造三角形),遇到奇怪的结果
经过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;
的 post:
- Using Namespace std
- Why is "using namespace std;" considered bad practice?
- ...
但似乎 using namespace std;
唯一做的就是偷工减料,以换取 classes/variables/namespaces 名称偶尔的冲突(争论是否使用时提到最多的一点)它)。
我确实找到了 1 个相关的 post : Why does g++ (4.6 and 4.7) promote the result of this division to a double? Can I stop it? ,但我在其他地方找不到更多信息。
那么我在这里缺少什么?
-- 一些机器信息:
- Windows 10、64 位
- 代码::块 20.03
- gcc/g++ 6.3.0
那是因为你还没有将std::
添加到abs()
,因此编译器并不知道它是什么功能,ergo UB。它很可能已经找到并使用了 C 版本的函数,该函数是为 int
个参数创建的。
您 有名称冲突:int abs(int)
versus 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);
}