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

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

19 голосов
/ 07 ноября 2010

Что означают «-1L», «1L» и т. Д. В C?

Например, в справочнике ftell написано

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

Что это значит?Какой тип "1л"?

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

Ответы [ 6 ]

39 голосов
/ 07 ноября 2010

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
}
6 голосов
/ 07 ноября 2010

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

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

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

4 голосов
/ 07 ноября 2010

Это означает, что нужно возвращать значение как long, а не как int.

2 голосов
/ 07 ноября 2010

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

2 голосов
/ 07 ноября 2010

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

1 голос
/ 21 июля 2013

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

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

Мой любимый способ тестирования отличается от Маркса и является вопросом предпочтения, а не совершенства.

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 ) для людей, серьезно относящихся к написанию переносимого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...