Подтвердить что ты не робот

Mmh, кто вы PRIu64?

Я новичок в C, и я столкнулся с:

#include <stdio.h>
#include <inttypes.h>

int main(void)
{
    uint64_t foo = 10;
    printf("foo is equal to %" PRIu64 "!\n", foo);

    return 0;
}

И это работает! Я не понимаю, почему? Может ли кто-нибудь помочь мне в этом? Большое спасибо! торр

4b9b3361

Ответ 1

PRIu64 является спецификатором формата, представленным на C99, для печати uint64_t, где uint64_t есть (со страницы ссылки):

беззнаковый целочисленный тип с шириной... 64 бит соответственно (если только реализация напрямую поддерживает тип)

PRIu64 - строка (литерал), например:

printf("%s\n", PRIu64);

печатает llu на моей машине. Смежные строковые литералы объединяются, из раздела 6.4.5 Строковые литералы стандарта C99:

В фазе перевода 6, многобайтовые последовательности символов, заданные любой последовательностью символов смежного символа и широкоформатных литералов, объединены в одну многобайтовую последовательность символов. Если какой-либо из токенов - это широкоформатные строковые литералы, результирующая многобайтовая последовательность символов рассматривается как широкий строковый литерал; в противном случае он рассматривается как литерал строковой буквы.

Это означает:

printf("foo is equal to %" PRIu64 "!\n", foo);

(на моей машине) совпадает с:

printf("foo is equal to %llu!\n", foo);

См. http://ideone.com/jFvKR9.