このコードは、一部の数値回文を正しく識別し、他の回文で失敗することにより、ランダムに失敗します。
#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()
のプログラムが常に正しく動作しているように見える前に。では、最初のバージョンでは何が起こっているのでしょうか? 変数が使用前に初期化されていない場合、これはある種の未定義の動作ですか?
編集:コンパイラが何をしているかを確認できないコンパイル済みバージョンのアセンブリを後で提供します。