百思不得其解!关于using namespace std;的问题

C++语言 码拜 8年前 (2017-05-08) 2236次浏览
是一道简单的PAT上的题目:N个数求和   链接:https://www.patest.cn/contests/gplt/L1-009
但是遇到了一个困惑本人好几天的问题,
代码完全是用C语言写的,交代码的时候显示第三个用例错误,但是只要将预定义写成

#include<cstdlib>;
#include<cstdio>;
using namespce std;

就正确了。有人知道这是为什么吗?!求帮助!
代码如下:

//#include<cstdio>
//#include<cstdlib> 
#include<stdio.h>
#include<stdlib.h>
#define ll long long
//using namespace std;
ll gcd(ll a, ll b)//最大公约数 
{
	return a%b==0?b:gcd(b,a%b);
}
int main()
{
	ll N,gfm,fzh,zs,fsfz;//公分母 分子和 整数 分数分子 
	ll fz[100000],fm[100000];
	scanf("%lld",&N);
	for(int i=0;i<N;i++)
	{
		scanf("%lld/%lld",&fz[i],&fm[i]);
	}
	gfm = fm[0];
	for(int i=1;i<N;i++)//求公分母 
	{
		gfm = gfm/gcd(fm[i],gfm)*fm[i];
	}
	fzh = 0;
	for(int i=0;i<N;i++)//求分子和 
	{
		fzh += gfm/fm[i]*fz[i];
	}
	zs = fzh/gfm;//整数部分 
	fsfz = abs(fzh%gfm);//分数部分的分子 
	if(fsfz==0)
		printf("%lld\n",zs);
	else
	{
		if(zs!=0)
		{
			printf("%lld ",zs);
		}
		if(fzh<0&&zs==0)
			printf("-");
		printf("%lld/%lld\n",fsfz/gcd(fsfz,gfm),gfm/gcd(fsfz,gfm)); 
	}
	return 0;
}
解决方案

90

这个问题以前已经有人指出了(但是许多人都无视)。
C++标准中,cstdio声明的是

namespace std {
          int abs (          int n);
     long int abs (     long int n);
long long int abs (long long int n);
}

C语言标准的stdio.h中声明的只是int abs (int n)。
所以,假如不“包含cstdio并指定在std名空间中查找”的话,编译器只会通过stdio.h找到来自C语言的int ::abs (int n),而不是你想要的int long long int std::abs (long long int n)。
假如不使用using namespace std,而明确以std::abs(参数)的形式调用,编译器就不会在你只包含stdio.h的时候悄悄使用int ::abs (int n)。(这也是经典C++编程中不建议使用using namespace std的理由。)

10

更正一下:
abs是在<cstdlib>与<stdlib.h>中声明的。

引用:

那c语言就没法交对这个代码了吗百思不得其解!关于using namespace std;的问题

C99标准中:
<stdlib.h>有long long llabs(long long n);
<inttypes.h>有intmax_t imaxabs(intmax_t n);


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明百思不得其解!关于using namespace std;的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)