Я пытаюсь улучшить свое понимание C ++, особенно арифметики указателей. Я довольно часто использую атой, но редко задумывался о том, как это работает. Глядя на то, как это делается, я в основном это понимаю, но есть одна вещь, которая меня смущает.
Вот пример решения, которое я нашел в Интернете:
int atoi( char* pStr )
{
int iRetVal = 0;
if ( pStr )
{
while ( *pStr && *pStr <= '9' && *pStr >= '0' )
{
iRetVal = (iRetVal * 10) + (*pStr - '0');
pStr++;
}
}
return iRetVal;
}
Я думаю, что основная причина, по которой мне было трудно понять, как атой делалось в прошлом, - это способ сравнения персонажей. Оператор while говорит: пока символ существует, и символ меньше или равен 9, и он больше -или-равно-0, затем что-нибудь делать. Это заявление говорит мне о двух вещах:
- Символы можно логически сравнить с другими символами (но каково возвращаемое значение?).
До того, как я рассмотрел это, полагаю, я знал это подсознательно, но на самом деле никогда не думал об этом, но символ «5» «меньше», чем символ «6», точно так же, как 5 меньше 6, так что вы можете сравнить символы как целые числа, по сути (для этой цели).
- Почему-то while (* sPtr) и * SPtr! = 0 разные. Мне это кажется очевидным, но я считаю, что не могу выразить это словами, а это значит, что я знаю, что это правда, но не понимаю, почему.
Изменить: я понятия не имею, что будет делать часть * pStr - '0'.
Любая помощь в осмыслении этих наблюдений была бы очень ... полезной! Спасибо!
while(*s)
иwhile(*s != 0)
- это одно и то же. В языке C ненулевые целые числа считаются истинными. - person nneonneo   schedule 31.01.2013while(*s != 0)
иwhile(*s != '0')
не одинаковы, потому что0
- это число 0, а'0'
- это символ '0' (который имеет значение ASCII 48). - person nneonneo   schedule 31.01.2013'0'!=0
.*pStr <= '9' && *pStr >= '0'
проверяет, является ли*pStr
цифрой - person Grizzly   schedule 31.01.2013