c - 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;
}
解决方案
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
推荐阅读
- jquery - 无法使用 jQuery 隐藏跨度
- git - 使用 jq 从项目中克隆所有 BitBucket 存储库
- python - 我在“Grokking Algorithms”一书中发现了一个错误
- php - 如何在 laravel Eloquent 中选择所有数据+连接数据
- css - 强制子元素宽度不在弹性框中溢出
- graphite - 如何调试碳聚合器不聚合系列?
- javascript - 使用 React,如何将点击事件附加到类或 ID?
- react-native - react-dropzone:使用已上传到服务器的图像填充字段
- c# - 尝试通过用 C# 编写的 Windows 服务在 ThingWorx 上上传扩展
- php - 将多行转换为单行