C编程中MinGW(代码块)和VC ++ 6.0编译器之间的结果不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C编程中MinGW(代码块)和VC ++ 6.0编译器之间的结果不匹配相关的知识,希望对你有一定的参考价值。

我在VC ++ 6.0和CodeBlocks中编译了下面的代码。但是当我执行它们时,结果会有所不同。它在VC ++ 6.0环境中显示-5792的正确结果,但是..使用相同的代码,其结果不是-5792而是CodeBlocks或DEV-C ++(MinGW编译器)中的+5792我认为MinGW编译器表现得非常奇怪VC ++ 6.0的。我真的想知道是什么导致MinGW编译器导致不值的值(+5792)。我很抱歉我的奇怪的英语可能会让你误会,我期待任何回复,这可能是解决问题的好方法,目前我很想知道。

#define STACK_SIZE 4
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int d_TOP=-1,c_TOP=-1;

char* init_cstack(int i)
{
    return (char*)malloc(sizeof(char)*i+2);

}
int* init_dstack(int i)
{
    return (int*)malloc(sizeof(int)*i+2);

}

void d_push(int a,int* d_stack)
{
    if(d_TOP==STACK_SIZE-1)
    {
        printf("error! STACK is FULL!!
");
        return;
    }
    else

    d_stack[++d_TOP]=a;
}
void c_push(char a,char* c_stack)
{
    if(c_TOP==STACK_SIZE-1)
    {
        printf("error! STACK is FULL!!
");
        return;
    }
    else

    c_stack[++c_TOP]=a;
}

int d_pop(int* d_stack)
{
    if(d_TOP==-1)
    {
        printf("error! STACK is EMPTY!!
");
        return -1;
    }
    return d_stack[d_TOP--];

}
char c_pop(char* c_stack)
{
    if(c_TOP==-1)
    {
        printf("error! STACK is EMPTY!!
");
        return -1;
    }
    return c_stack[c_TOP--];

}

int main()
{
    //char* c=init_cstack(STACK_SIZE);
    int* d=init_dstack(STACK_SIZE);
    d_push(-2341,d);
    d_push(3451,d);
    printf("%d",(d_pop(d)*-1)+d_pop(d));
    return 0;
}
答案
printf("%d",(d_pop(d)*-1)+d_pop(d));

表达式中子表达式的评估顺序无法保证。第一个d_pop可能发生在第二个之前或之后:C标准在这方面不作任何保证;它只保证子表达式的结果按优先规则规定的顺序组合。

在你的情况下,VC ++首先执行第一个d_pop(),所以你有(3451*-1)+(-2341) = -5792,而MinGW首先执行最后一个d_pop(),所以你有(-2341*-1)+3451) = 5792

要确保按特定顺序评估子表达式,请将它们拆分为单独的语句。

int a = d_pop(d);      // a =  3451
int b = d_pop(d);      // b = -2341
printf("%d",(a*-1)+b); // -5792

以上是关于C编程中MinGW(代码块)和VC ++ 6.0编译器之间的结果不匹配的主要内容,如果未能解决你的问题,请参考以下文章

vc++6.0怎么快捷注释多行代码

Visual Mingw

C/C++编程笔记:VC++6.0环境下调试 C语言 代码的方法和步骤

为啥在网上找的一些c语言程序的代码在vc++6.0中编译总是出现错误?求指教

vc++6.0怎么编译多个C文件

vc++6.0不能编译