为什么这个C程序在Windows上编译时显示不同的输出?

现在,我在ProjectEuler.net上做了一些问题,这是我为问题4编写的代码:

#include <assert.h> #include <errno.h> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int isPalindrome(int num) { int length = floor(log10(abs(num))) + 1; int index = 0; int firstChar, lastChar; while (index <= (length / 2)) { firstChar = (num % (int)pow(10, length - index)) / pow(10, length - 1 - index); lastChar = (num % (int)pow(10, (index + 1))) / (pow(10, index)); if (firstChar != lastChar) { return 0; } index++; } return 1; } int main(int argc, char *argv[]) { clock_t begin, end; double time_spent; int result = 0; int x, y; printf("Is 998001 a palidrome? %d\n", isPalindrome(998001)); printf("Is 987789 a palidrome? %d\n", isPalindrome(987789)); printf("Is 884448 a palidrome? %d\n", isPalindrome(884448)); /* clock start */ begin = clock(); for (x = 999; x > 99; x--) { for (y = 999; y > 99; y--) { if (isPalindrome(x * y) && x * y > result) { result = x * y; printf("Found palindrome: %d\tX: %d\tY: %d\n", result, x, y); } } } end = clock(); /* clock end */ time_spent = (double)(end - begin) / CLOCKS_PER_SEC; printf("ANSWER: %d\n", result); printf("ELAPSED TIME: %f\n", time_spent); return 0; } 

不漂亮,但它的作品。 当我在GNU / Linux上编译时,它工作正常。 但是,在Windows 7 64位,我得到这个输出:

Windows输出

预期产出:

Linux输出

这是奇怪的地方。 如果你换行17和18(以firstChar和lastChar开头的行),它在Windows和GNU / Linux上都能正常工作。

这里发生了什么? 我使用mingw32 gcc编译这样的:

 gcc -v prob4.c -o prob4.exe -lm 

这是编译器输出: http : //pastebin.com/rtarBtNY

认真的家伙到底发生了什么?

浮点的问题。 如果您有以下代码:

 pow(10, 2) 

你期望的价值返回到100.它可能是,但没有保证。 在一定的误差范围内,你会得到接近100的值。

如果返回的值是100+d (其中d在精度范围内),那么当该值被转换为一个int时,返回100 。 如果返回的值是100-d那么当这个值被转换为一个int你会返回99

该代码甚至不应该编译。 你在main中声明了一个函数。

如果您将isPalindrome()函数定义移到main之外,我可以验证它是否在linux中编译,没有错误,也没有警告。