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

Что такое "-1L" в C?

Что означают "-1L", "1L" и т.д. в C?

Например, в ftell ссылка говорит

... Если возникает ошибка, возвращается -1L...

Что это значит? Каков тип "1L"?

Почему бы не вернуть NULL, если возникла ошибка?

4b9b3361

Ответ 1

L указывает, что число является типом long, поэтому -1L является long, установленным на отрицательный, и 1L является long, установленным на положительный.

Что касается того, почему ftell возвращает не только NULL, потому что для указателей используется NULL, и здесь возвращается long. Обратите внимание, что 0 не используется, потому что 0 является допустимым значением для ftell для возврата.

Захват этой ситуации включает проверку неотрицательного значения:

long size;
FILE *pFile;

...

size = ftell(pFile);
if(size > -1L){
    // size is a valid value
}else{
    // error occurred
}

Ответ 2

ftell() возвращает тип long int, суффикс L, применяемый к литералу, заставляет его тип длинным, а не простым int.

NULL будет полностью неверным, поскольку это макрос, представляющий указатель, а не целое число. Его значение при интерпретации и целое число может представлять допустимую позицию файла, а -1 (или любое отрицательное значение) не может.

Во всех смыслах и целях вы обычно можете просто считать, что ошибка возвращается как -1, суффикс L не является критическим для правильной работы в большинстве случаев из-за неявных правил литья

Ответ 3

Это означает, что значение возвращается как long, а не int.

Ответ 4

Это означает, что -1 как длинный (а не тип по умолчанию для чисел, который является целым числом)

Ответ 5

-1, образованный в long int, является -1L. Почему не просто NULL? Потому что NULL в этой функции является нормальным результатом и не может также игнорировать ошибку. Почему NULL в этой функции является нормальным результатом? Поскольку NULL == 0 и ftell возвращает позицию в потоке, когда вы начинаете функцию потока, возвращается 0, и это обычный результат, а не ошибка, то, если вы сравниваете эту функцию с NULL, чтобы проверить ошибку, вы будет возникать ошибка, когда вы будете в исходной позиции в потоке.

Ответ 6

Редактирование сегодня подразумевает, что все детали еще нужны.

У Марка все правильно. Суффикс "L" длинный. -1L, таким образом, длинный -1.

Мой предпочтительный способ тестирования отличается от Marks и является вопросом предпочтения не добра.

if ( err >= 0L )
    success
else
    error

По общему привычку мне не нравится искать явный -1. Если в будущем появится -2, мой код будет вероятен не сломаться.

С тех пор, как я начал использовать C, еще в начале C, я заметил, что большинство подпрограмм библиотеки, возвращающих значения int, возвращают 0 для успеха и -1 при ошибке. Наиболее.

NULL обычно не возвращается целыми функциями, поскольку NULL является значением указателя. Помимо столкновения типов огромная причина не возврата NULL зависит от немного истории.

Вещи не были чистыми, когда C был изобретен, и, возможно, даже не на небольших системах сегодня. Исходный K & R C не гарантирует, что NULL будет равен нулю, как это обычно бывает на процессорах с виртуальной памятью. В небольших системах "реальной памяти" ноль может быть допустимым адресом, что делает необходимым, чтобы "недействительные" адреса были перемещены в другое местоположение, зависящее от ОС. Такой подход действительно будет принят процессором, который просто не генерируется в обычной схеме вещей. Возможно, очень высокий адрес памяти. Я даже вижу скрытый массив с именем extern const long NULL[1];, позволяющий NULL стать адресом этого другого неиспользуемого массива.

В то время вы видели множество операторов if ( ptr != NULL ), а не if ( ptr ) для серьезных людей, пишущих переносимый код.