首页 > 解决方案 > C 编程中 MinGW(codeblock) 和 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!!\n");
        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!!\n");
        return;
    }
    else

    c_stack[++c_TOP]=a;
}

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

}
char c_pop(char* c_stack)
{
    if(c_TOP==-1)
    {
        printf("error! STACK is EMPTY!!\n");
        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;
}

标签: cstack

解决方案


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

推荐阅读