Другие языки программирования и технологии

isdigit() Непонятное поведение ф-ции

Ответ тебе дали... хотя ты хотел другое применить в коде.
А мне интересно стало че внутри городит компилятор и оказалось все же наиболее оптимально при isdigit использовать не функцию, а проверку вида:
unsigned char sm = '9';
int a;
if(sm > '9') a = 0;
else if(sm < '0') a = 0; else a = 1;
printf("%d",a);

так как функция всегда накладные расходы на загнать в стек, выгнать из него, да и всякое разное мутят еще.
Здесь же проверяется наиболее вероятное попадание в начале (символ > '9') и потом менее вероятное.

А как перегнать в int ты спрашивал, то вот ответ:
unsigned char sm = '9';
int a;
if(sm > '9') a = -1;
else if(sm < '0') a = -1; else a = sm - 48;
printf("%d",a);

Здесь будет -1 если sm не символ и цифра если символ цифры
Борис Долгалёв
Борис Долгалёв
71 340
Ну вообще-то вполне понятное!
По сути это число показывает позицию бита-индикатора.
Например, для Microsoft
#define _UPPER 0x1 /* upper case letter */
#define _LOWER 0x2 /* lower case letter */
#define _DIGIT 0x4 /* digit[0-9] */
#define _SPACE 0x8 /* tab, carriage return, newline, */
#define _PUNCT 0x10 /* punctuation character */
#define _CONTROL 0x20 /* control character */
#define _BLANK 0x40 /* space char */
#define _HEX 0x80 /* hexadecimal digit */
#define _LEADBYTE 0x8000 /* multibyte leadbyte */
#define _ALPHA (0x0100|_UPPER|_LOWER) /* alphabetic character */
Для Borland CBuilder6
enum mask {
space=1<<0, print=1<<1, cntrl=1<<2, upper=1<<3, lower=1<<4,
alpha=1<<5, digit=1<<6, punct=1<<7, xdigit=1<<8,
alnum=(1<<5)|(1<<6), graph=1<<9 };
Для Borland 3.1
#define _IS_SP 1 /* is space */
#define _IS_DIG 2 /* is digit indicator */
#define _IS_UPP 4 /* is upper case */
#define _IS_LOW 8 /* is lower case */
#define _IS_HEX 16 /* [0..9] or [A-F] or [a-f] */
#define _IS_CTL 32 /* Control */
#define _IS_PUN 64 /* punctuation */
В общем кто во что горазд!
Артем ****
Артем ****
76 473