Тревожное преобразование строки в 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
может быть усечен, если правильный заголовок не включен.