6

此代码通过正确识别一些数字回文并在其他回文上失败而随机失败。

#include <stdio.h>


int main(int argc, char *argv[])
{
   int n, reverse = 0, temp;

   printf("Enter a number to check if it is a palindrome or not\n");
   scanf("%d",&n);

   temp = n;

   while( temp != 0 )
   {
      reverse = reverse * 10;
      reverse = reverse + temp%10;
      temp = temp/10;
   }

   if ( n == reverse )
      printf("%d is a palindrome number.\n", n);
   else
      printf("%d is not a palindrome number.\n", n);

   return 0;
}

例如,上面的代码错误地说“87678”不是数字回文。

检查返回scanf()表明它成功并且打印的值n对于 87678 的输入是正确的。

然而,代码正确地说“4554”是一个回文。

但是,通过添加:

n = reverse = temp = 0;

在第一个printf()程序似乎一直正常工作之前。那么第一个版本发生了什么?当变量在使用前未初始化时,这是某种未定义的行为吗?

编辑:稍后将提供无法查看编译器在做什么的编译版本的程序集。

4

3 回答 3

4

除非sizeof(int)小于 4,否则您要么遇到编译器错误,要么您的硬件出现故障,或者您的系统中发生了某种形式的数据损坏。

回答这个问题:不,程序中的任何地方都没有未定义的行为(假设scanf()真的没有失败)。

尝试在您的系统上运行 memtest 以排除 RAM 问题:http ://www.memtest.org

于 2012-10-29T09:50:24.327 回答
2

这听起来很像你有一个编译器错误,因为这适用于更高版本的 gcc。我很想看看 gcc -S 的输出(请粘贴?),也想知道你正在使用的编译命令。(尤其是优化级别)。

于 2012-10-29T09:56:25.253 回答
-3

与 Java 不同,C 没有 int 的默认值。你可以参考这篇文章,因为它讨论了这个类似的问题。

于 2012-10-29T09:20:21.467 回答