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编译器之间的结果不匹配的主要内容,如果未能解决你的问题,请参考以下文章
C/C++编程笔记:VC++6.0环境下调试 C语言 代码的方法和步骤