Насколько возможно в C символьный параметр (определяемый реализацией?) Быть истинным как для islower (), так и для isupper ()? Книга так говорит

Следующие две строки, посвященные islower () и isupper (), даны в одном абзаце книги C Майка Банахана (ссылка: раздел 9.3):

islower (int c)

Истинно, если c - буква нижнего регистра. Также верно для набора символов, определенного реализацией, который не возвращает истинных результатов ни из iscntrl, isdigit, ispunct или isspace. В локали C этот дополнительный набор символов пуст.

isupper (int c)

Истинно, если c является буквенным символом верхнего регистра. Также верно для определенного реализацией набора символов, которые не возвращают истинные результаты из любого из iscntrl, isdigit, ispunct или isspace. В локали C этот дополнительный набор символов пуст.

Можете ли вы объяснить, как символ, если он не возвращает истинных результатов ни по одному из iscntrl, isdigit, ispunct или isspace, может привести к истинному результату для обеих функций? Насколько мне известно, символ может быть либо строчным, либо прописным, но не обоими (если мы говорим о наборах символов, которые имеют такое различие ... большинство европейских языков имеют).


person Thokchom    schedule 02.10.2014    source источник
comment
Я был бы более удивлен, если бы символ, который действительно вернул истину для одного из iscntrl, isdigit, ispunct или isspace, также вернул истину для islower или isupper!   -  person Peter - Reinstate Monica    schedule 02.10.2014
comment
@PeterSchneider Эту часть я понимаю, поскольку, если символ вернет истину для любой из упомянутых вами функций, это не будет алфавит ...   -  person Thokchom    schedule 02.10.2014


Ответы (2)


Цитаты из книги не утверждают, что isupper и islower должны возвращать true одновременно для одного и того же символа. Они только говорят, что если используется какой-то другой языковой стандарт, кроме C, locale, тогда могут быть некоторые дополнительные символы, для которых либо isupper, либо islower (или оба) могут вернуть true.

Учтите, что стандарт C определяет isalpha в терминах isupper и islower.

Функция isalpha проверяет любой символ, для которого истинно isupper или islower,

Хотя кажется возможным, что один и тот же символ, зависящий от локали, можно рассматривать как верхний и нижний одновременно. То есть возможны все четыре комбинации. Например

isupper: false, islower: false
isupper: true, islower: false
isupper: false, islower: true
isupper: true, islower: true

В стандарте C есть сноска:

200) Функции islower и isupper проверяют истинность или ложь отдельно для каждого из этих дополнительных символов; возможны все четыре комбинации

person Vlad from Moscow    schedule 02.10.2014
comment
Еще немного, пожалуйста, особенно для isalpha в контексте последней строки вашего ответа. - person Thokchom; 02.10.2014

Он может возвращать истину (для обеих функций) для языков, отличных от языкового стандарта "C", который может определять дополнительные символы: -

В этом случае:-

isalpha, isupper и islower возвращают ненулевое значение (при условии, что символы заставляют iscntrl, isdigit, ispunct и isspace возвращать ноль).

Для справки вы можете лучше понять эти зависимости здесь: - http://www.qnx.com/developers/docs/6.4.0/dinkum_en/cpp/ctype.html

person Varun Varunesh    schedule 02.10.2014
comment
Спасибо за ссылку. - person Thokchom; 03.10.2014