Turbo C++和GCC编译器在指针递增过程中产生不同的结果

Turbo C++ and GCC compiler produces different results during pointer incrementation?

本文关键字:过程中 结果 C++ GCC 编译器 指针 Turbo      更新时间:2023-10-16

下面的程序用于计算数组中浮点数的和。

我只是使用指针概念对其进行了修改,将数组"a"的基地址分配给指针变量"p",然后递增指针变量以计算数组的和。

int main()
{
    float a[5],*p,sum=0.0;
    int i;
    for(i=0;i<5;i++)
    {
        cin>>a[i];
    }
    p=a;
    for(i=0;*p!='';i++)
    {
        sum=sum+*p;
        *p++;
    }
    cout<<sum;
    return 0;
}

但是,当使用GCC编译器编译此程序时,数组的总和只会加倍。为什么会发生这种情况??

注意:此问题仅在GCC编译器中发生,Turbo C++会产生正确的结果。

编辑:正如你们所说的,不能保证p在数组末尾是0,那么为什么一个编译器(TURBO C++)能够产生正确的结果,而另一个(GCC)只是将其加倍,而不是打印一些垃圾值。

这是错误的循环条件:*p!=''

这相当于*p != 0.0f,但您的阵列不会以这种方式终止。循环将运行太长,程序将试图访问超出数组边界的内容,这是一个错误。您需要i < 5。这是循环的固定版本。

for (i = 0, p = a; i < 5; i++, p++) {
    sum += *p;
}

任何时候代码中出现此类错误,都有可能根据编译器或设置的不同而出现不同的错误。

由于这是C++,您可以用这种方式编写数组:

for (auto item : a) {
    sum += item;
}

这里的问题是假设p指向一个数组,其中最后一个(结束)元素是0,就像c样式字符串一样。这个假设是错误的。不要求在数组的末尾有一个0。

您需要使用数组的大小或通过将指针与经过结束元素的指针进行比较来终止循环。