飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3973|回复: 3

VC6的BUG?

[复制链接]

该用户从未签到

发表于 2009-3-22 23:50:19 | 显示全部楼层 |阅读模式
我给别人该错的时候发现的:
明显参数不对 但是能编译 能执行 不行你试试你的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)
{
        int  i,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));  // 这里明显参数不对
                                }
                        }
                }
        }

}
void  print(int *a,int n)
{
        int i;
        for(i=0;i<n;i++)
        {
                printf("%d ",*(a+i));
        }
        printf("\n");
}
int main()
{
    int a[9]={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;
}
PYG19周年生日快乐!

该用户从未签到

发表于 2009-4-6 13:16:10 | 显示全部楼层
编译链接运行都是正确的。直接看代码,我没有看出个所以然来。于是我使用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。
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2009-4-8 17:21:42 | 显示全部楼层
原帖由 asdfslw 于 2009-4-6 13:16 发表
编译链接运行都是正确的。直接看代码,我没有看出个所以然来。于是我使用VC6调试了一下。。。

O(∩_∩)O~呵呵,居然让我发现了其中的奥秘。O(∩_∩)O~

具体调试过程如下:
在max函数定义处的
     swap(*(a+ ...



问题在这里 如果给的不是指针 那么交换的数据对原数据是如何产生改变的呢 晚上我也看一下 ~
PYG19周年生日快乐!

该用户从未签到

发表于 2009-4-10 12:22:21 | 显示全部楼层
c:\...\vc98\include\xutility 中的如下代码段
template<class _Ty> inline
        void swap(_Ty& _X, _Ty& _Y)
        {_Ty _Tmp = _X;
        _X = _Y, _Y = _Tmp; }
这个函数是个模板函数,形式参数是引用类型,调用此函数的时候只需要传递变量名就可以了,不需要传递变量的地址。
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表