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

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

#include <stdio.h>

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

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

    return 0;
}

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

Это работает, хотя:

printf("Value is: %lld\n", 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 (до C89) использование функции без ее предварительного объявления генерирует только предупреждение из GCC, а не ошибку (Как указано в первом комментарии, в C89 также допускаются неявные объявления функций, поэтому генерирование ошибки не подходит, это еще одна причина, по которой генерируется только предупреждение). Но тип возврата такой функции предполагается int (не тип, указанный в stdlib.h за atoll например), поэтому программа выполняется неожиданно, но не выдает ошибку. Если вы компилируете с -Wall вы увидите, что:

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

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

ПРИМЕЧАНИЕ: (как ответ на один из комментариев к вопросу). Это причина, по которой результаты atoll может быть обрезано, если правильный заголовок не включен.

Другие вопросы по тегам