C 若局部变量未初始化,则代码将运行错误
这是一个计算素数的小代码,用gcc Debian 8.3.0-6 8.3.0编译 当我使用int64_t p=0时,它工作得很好。使用int64\u t p,它工作错误。这有什么问题 变量p将由use scanf分配 对于int64\u t p=0,可以: 您已将p声明为int64_t,但%d表示int。int64_t和其他stdint.h类型的转换说明符位于inttypes中。h: 类似地,使用正确的说明符打印时,此处会向您显示问题:C 若局部变量未初始化,则代码将运行错误,c,C,这是一个计算素数的小代码,用gcc Debian 8.3.0-6 8.3.0编译 当我使用int64_t p=0时,它工作得很好。使用int64\u t p,它工作错误。这有什么问题 变量p将由use scanf分配 对于int64\u t p=0,可以: 您已将p声明为int64_t,但%d表示int。int64_t和其他stdint.h类型的转换说明符位于inttypes中。h: 类似地,使用正确的说明符打印时,此处会向您显示问题: printf("i:%" PRId64 " < nu
printf("i:%" PRId64 " < number:%" PRId64 "\n", i, number);
最后,main的正确返回类型是int,而不是int32\u t。此scanf%d,&p;是读取int64\t的错误代码。正式地说,您需要scanf%SCNd64和&p-而不是,或者以及
您可能会侥幸逃脱scanf%lld,&p;因为在大多数机器上,int64\t是long的同义词
在使用结果之前,还应该检查scanf是否返回1
当您初始化p时,您将获得scanf调用设置的p的“正确”部分,因为您在一台小型endian机器上,剩余部分为零。但这样做会引发未定义的行为。任何事情都有可能发生。它是不可移植的,可能无法在big-endian计算机上执行您想要的操作,而且完全不可靠,因为它是未定义的行为。%d提供int 4字节的转换,而您希望读取int 64_t 8字节。类型和转换说明符之间的不匹配会导致未定义的行为。main的返回类型值得一提,但在大多数计算机上,int32_t是int的同义词,因此C11中的脚注10适用。不过,我同意:使用int32\t作为返回类型不是一个好主意。
gcc t.c && ./a.out
input a prime:3
i:2 < number:3
i:3 < number:3
i:4 < number:3
i:5 < number:3
i:6 < number:3
i:7 < number:3
i:8 < number:3
i:9 < number:3
i:10 < number:3
i:11 < number:3
i:12 < number:3
i:13 < number:3
3 not a prime, again
#include <stdint.h>
#include <stdio.h>
int32_t isPrime(int64_t number)
{
int64_t i = 2;
for(; i < number; i++)
{
printf("i:%d < number:%d\n",i, number);
if((number % i) == 0)
return 0;
if ((i * i) >= number)
break;
}
return 1;
}
int32_t main(void)
{
int64_t t = 0;
int64_t p;
//int64_t p = 0;
printf("input a prime:");
do
{
scanf("%d",&p);
getchar();
if (isPrime(p))
printf("%d is a prime, again:", p);
else
printf("%d not a prime, again:", p);
}while(1);
}
#include <inttypes.h>
scanf("%" SCNd64, &p);
printf("i:%" PRId64 " < number:%" PRId64 "\n", i, number);
if (scanf("%" SCNd64, &p) != 1) {
return EXIT_FAILURE;
}