Тревожное преобразование строки в long long в C

у меня возникли проблемы с получением функции atoll для правильной установки длинного длинного значения в c. Вот мой пример:

#include <stdio.h>

int main(void) {
    char s[30] = { "115" };
    long long t = atoll(s);

    printf("Value is: %lldn", t);

    return 0;
}

это печатает: Значение: 0

это работает:

printf("Value is: %lldn", atoll(s));

что здесь происходит?

1 ответов


во-первых, давайте ответим на ваш вопрос:

#include <stdio.h>
#include <stdlib.h>  // THIS IS WHAT YOU ARE MISSING


int main(void) {
    char s[30] = { "115" };
    long long t = atoll(s);

    printf("Value is: %lld\n", t);

    return 0;
}

тогда давайте обсудим и ответим " почему?':

для совместимости с очень старыми программами C (pre-C89), используя функцию, не объявив ее сначала, генерирует только предупреждение от GCC, а не ошибку (как указано в первом комментарии здесь, также неявные объявления функций разрешены в C89, поэтому генерирование ошибки не будет уместным, что является еще одной причиной почему генерируется только предупреждение). но предполагается, что возвращаемый тип такой функции будет int (Не тип, указанный в stdlib.h на atoll например), поэтому программа выполняется неожиданно, но не генерирует ошибку. если вы компилируете с -Wall вы увидите, что:

предупреждение: неявное объявление функции atoll

этот факт в основном шокирует людей, когда они используют atof без включения stdlib.h в этом случае ожидается double стоимости не возвращается.

Примечание: (в качестве ответа на один из комментариев на вопрос) это причина, почему результаты atoll может быть усечен, если правильный заголовок не включен.