VC6的BUG?
我给别人该错的时候发现的:明显参数不对 但是能编译 能执行 不行你试试你的VC6
#include <iostream>
using namespace std;
void swap(int * a,int * b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void max(int *a,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(*(a+j)<*(a+j+1))
{
swap(*(a+j),*(a+j+1));// 这里明显参数不对
}
}
}
}
void min(int *a,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(*(a+j)>*(a+j+1))
{
swap(a+j,a+j+1); // 参数应该是这个样子
}
}
}
}
void luanxu(int *a,int n)
{
inti,j;
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(i%2==0)
{
if(*(a+j)<*(a+j+1))
{
swap(*(a+j),*(a+j+1));// 这里明显参数不对
}
}
else
{
if(*(a+j)>*(a+j+1))
{
swap(*(a+j),*(a+j+1));// 这里明显参数不对
}
}
}
}
}
voidprint(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%d ",*(a+i));
}
printf("\n");
}
int main()
{
int a={2,1,3,4,5,6,7,9,8};
max(a,9);
print(a,9);
min(a,9);
print(a,9);
luanxu(a,9);
print(a,9);
return 0;
} 编译链接运行都是正确的。直接看代码,我没有看出个所以然来。于是我使用VC6调试了一下。。。
O(∩_∩)O~呵呵,居然让我发现了其中的奥秘。O(∩_∩)O~
具体调试过程如下:
在max函数定义处的
swap(*(a+j),*(a+j+1));// 这里明显参数不对
下断点,调试状态下,停在此处,然后F11跟进去,发现了一个问题:
光标指向了文件
c:\...\vc98\include\xutility 中的如下代码段
template<class _Ty> inline
void swap(_Ty& _X, _Ty& _Y)
{_Ty _Tmp = _X;
_X = _Y, _Y = _Tmp; }
而并非我们自己定义的swap函数代码。
呵呵。说到这里,估计高手马上就明白了其中的道理了O(∩_∩)O~
。。。如果你没有明白的话,那就继续往下看。。。
我们自己定义了一个swap函数,VC又自带一个swap函数,虽同名,但形式参数的不同导致编译器给函数起的名字不同,即实现了函数的重载。因此C++编译器对
swap(*(a+j),*(a+j+1));
之类的“错误”并不报错(因为的确有这种形式参数的swap函数),并且由于这两个函数实际上完成了同样的功能--交换两个数,所以执行结果也是正确的。
所以说这并非VC的bug。 原帖由 asdfslw 于 2009-4-6 13:16 发表 https://www.chinapyg.com/images/common/back.gif
编译链接运行都是正确的。直接看代码,我没有看出个所以然来。于是我使用VC6调试了一下。。。
O(∩_∩)O~呵呵,居然让我发现了其中的奥秘。O(∩_∩)O~
具体调试过程如下:
在max函数定义处的
swap(*(a+ ...
问题在这里 如果给的不是指针 那么交换的数据对原数据是如何产生改变的呢 晚上我也看一下 ~ c:\...\vc98\include\xutility 中的如下代码段
template<class _Ty> inline
void swap(_Ty& _X, _Ty& _Y)
{_Ty _Tmp = _X;
_X = _Y, _Y = _Tmp; }
这个函数是个模板函数,形式参数是引用类型,调用此函数的时候只需要传递变量名就可以了,不需要传递变量的地址。
页:
[1]