Как я думаю,% d в printf будет читать sizeof (int) из стека, а% ld будет читать sizeof (long) из стека и так далее для% lld. Я написал этот фрагмент кода:
##############printf1.c
#include <stdio.h>
int main()
{
int a = 1, b = 2;
long la = 1, lb = 2;
long long lla = 1, llb = 2;
printf("a=%d, b=%d\n", a, b);
printf("a=%ld, b=%ld\n", a, b);
printf("a=%lld, b=%lld\n", a, b);
printf("la=%d, lb=%d\n", la, lb);
printf("la=%ld, lb=%ld\n", la, lb);
printf("la=%lld, lb=%lld\n", la, lb);
printf("lla=%d, llb=%d\n", lla, llb);
printf("lla=%ld, llb=%ld\n", lla, llb);
printf("lla=%lld, llb=%lld\n", lla, llb);
return 0;
}
И вывод на моей машине был:
$ ./printf1
a=1, b=2
a=1, b=2
a=1, b=2
la=1, lb=2
la=1, lb=2
la=1, lb=2
lla=1, llb=2
lla=1, llb=2
lla=1, llb=2
Как это произошло? Я думаю, что должны быть некоторые ненужные выходные данные, если тип переменной и идентификатор типа не совпадают. Мой компьютер:
$ uname -a
Linux cu01 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Мой gcc:
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
пс: Я прочитал этот пост: printf переменной size_t с идентификаторами типов lld, ld и d .Но проблема автора не возникла в моем тесте. Что касается кода автора:
##############printf2.c
#include <stdio.h>
int main()
{
size_t temp;
temp = 100;
printf("lld=%lld, ld=%ld, u=%u\n", temp, temp, temp);
printf("ld=%ld, u=%u, lld=%lld\n", temp, temp, temp);
return 0;
}
Результат вывода на моей машине всегда "правильный":
$ ./printf2
lld=100, ld=100, u=100
ld=100, u=100, lld=100
Может кто-нибудь дать объяснение этим? Большое спасибо за вашу помощь!