C 若局部变量未初始化,则代码将运行错误

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

这是一个计算素数的小代码,用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 " < 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;
}