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