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

Какое реальное использование n [c-'0]?

Я новичок в C, и я натолкнулся на такой код:

int n[10];
if(c>='0' && c<='9')
++n[c-'0']

В цикле if, почему мы должны использовать одинарные кавычки вокруг 0, что его использовать, почему мы не можем сразу определить 0 как целое число? А во второй строке кода ++n[c-'0'], зачем использовать такой массив, в смысле, почему нам нужно вычитать 0 (еще раз, почему использование одинарных кавычек в этом контексте?) Из c в индекс массива?

Если мне нравится это n[c-'0'], результатом операции индекса (c-'0') будет символ или целое число?

Учитывая, что кто-нибудь может сказать мне, каково реальное использование такого массива и каковы его недостатки?

Спасибо заранее.

4b9b3361

Ответ 1

В C, '0' - целое число, значение которого представляет цифру нуль в качестве символа, а не значение 0, которое будет нулевым символом. Другие ответы опустили это, но важно отметить, что язык C означает, что десятичные цифры имеют последовательные значения, так что если c является цифрой, c-'0' является числовым значением этой цифры, то есть

'0'-'0' = 0
'1'-'0' = 1
'2'-'0' = 2
.
.
.
'9'-'0' = 9

Ответ 2

c (вероятно) a char, который также имеет целочисленное представление, а в C он может быть преобразован неявно. '0' - символ нуль, и удобной особенностью числовых символов является то, что они выложены последовательно в их целочисленных представлениях.

Итак, теперь, когда вы знаете, что каждый символ имеет целочисленное представление и что числовые символы выложены последовательно, вы можете преобразовать символ в его целочисленное представление, используя простое вычитание.

'0' - '0' == 0
'1' - '0' == 1
'2' - '0' == 2
/* and so on and so forth */

Итак, если вы хотите подсчитать количество цифр в строке, вы можете использовать это в своих интересах:

int n[10]; /* 10 digits */

n['0' - '0'] /* where we store the counts for the character 0, aka n[0] */
n['1' - '0'] /* where we store the counts for the character 1, aka n[1] */

Ответ 3

Как вы уже знаете, компьютеры представляют символы как числа. Стандарт C требует, чтобы это представление должно гарантировать, что цифры должны следовать друг за другом. Поэтому, если n является кодом '0', то n + 9 является кодом '9'. Для ASCII эти значения равны соответственно 48 и 57.

Проведенный вами пример кода пытается быть агностиком кодирования, поэтому вместо проверки на 48 или 57 он использует '0' в качестве переносимой константы.

Ответ 4

'0' и '9' имеют типы int. Их значения равны 48 и 57 соответственно (поскольку 48 и 57 являются значениями ASCII символов '0' и '9').

Итак, вы, вероятно, держите в n массив для подсчета цифр.

Итак, это выражение (если вы сохраняете цифровые символы на c):

++n[c-'0'];

Средства:

  • Возьмите n номер позиции c-'0' (c содержит символ с цифрой на нем)
  • Увеличьте это положение на единицу.

Итак, n будет:

n[0] = x; // count of 0 characters
n[1] = x; // count of 1 characters
n[2] = x; // count of 2 characters
n[3] = x; // count of 3 characters
n[4] = x; // count of 4 characters
n[5] = x; // count of 5 characters
n[6] = x; // count of 6 characters
n[7] = x; // count of 7 characters
n[8] = x; // count of 8 characters
n[9] = x; // count of 9 characters

Например, пусть c равен символу 2. 2 Значение ascii 50. Итак, n[50-48] становится n[2]. Таким образом, вы можете использовать третий элемент массива n для хранения символа 2.

Ответ 5

Извлеченный из контекста, невозможно сказать, почему автор мог это сделать.

Что делает код, это цикл над символами '0' до '9', возможно, чтобы сравнить их с некоторым пользовательским вводом. Во время тела цикла символы преобразуются в целые числа 0..9 для индексирования массива n.

Символы в C могут вести себя как целые числа, когда они участвуют в арифметике, путем преобразования в их целочисленное представление ASCII. Первый раз через цикл c равен 0, а '0' - '0' является целым числом 0, независимо от того, что такое целочисленное значение '0'. То есть x - x всегда будет равен 0; фактическое значение x в этом случае несущественно.

Учитывая это и тот факт, что значения ASCII являются последовательными, увеличивая от 0 до 9, вы можете сказать, что второй раз через цикл, когда c будет '1', что '1' - '0' является целым числом 1 и т.д.

Ответ 6

'0' обозначает значение символа, которое может быть безшовно преобразовано в целое число, и результатом является (обычно) значение ASCII символа '0' (которому оказывается 48). Условие if проверяет, что c (преобразуется в) значение символа, которое содержит цифровую цифру. Это возможно, потому что числовые цифры от 0 до 9 представлены последовательными значениями в ASCII chart от 48 до 57 соответственно. Если вы вычтите значение ASCII '0' (т.е. 48) из значения ASCII любого символа цифровой цифры, вы получите числовое значение этой цифры (от 0 до 9).

Таким образом, код выше индексирует в массив счетчиков, возможно, чтобы подсчитать появление каждой числовой цифры в некотором фрагменте текста.

Ответ 7

Во-первых, if не является циклом, это утверждение. Только один проход через код.

Это означает, что первая строка может читать if c is a digit, а вторая строка объединяет преобразование цифры ascii в целую цифру (и увеличивает элемент массива n для подсчета этой цифры).

Ответ 8

Потому что c - это символ, а не целое число.

Значение ASCII "0" равно 48, поэтому "0" будет индексом 48 в операторе n[c], а программист хотел, чтобы "0" был индексом 0, поскольку n был определен n[10], поэтому Значение ASCII преобразуется в его целочисленный эквивалент путем вычитания кода для "0" так: '0' - '0' = 0, '1' - '0' = 1 и т.д. Коды ASCII для "0" - "9" - от 48 до 57, поэтому преобразование является звуковым.

Что касается того, почему, я думаю, кто-то подсчитывает частоту цифр от 0 до 9 в некотором тексте.

Ответ 9

Это позволяет использовать char как индекс массива. Например, вы можете определить строку "012345", возможно, прочитанную из внешнего файла и вычислить для каждого символа c-'0', который даст целые числа 0, 1, 2, 3, 4 и 5 соответственно.

Ответ 10

Посмотрите на таблицу ASCII, так как она, вероятно, достаточно хорошо объясняет это. Десятичное представление для символа "0" равно 48, "1" равно 49 и т.д. Большинство, если не все компиляторы, следуют этой таблице преобразования.

Вычитая "0" (скорее всего, число 48), вы по существу превращаете представление символа переменной c в числовое представление.

edit: Как упоминалось в комментариях, я должен указать, что числовое представление "0" или "9" необязательно следует за таблицей преобразования ASCII (хотя я считаю, что все распространенные компиляторы делать). Это техническая деталь и относится к обсуждению спецификации ANSI C, а не к ответу, направленному на кого-то, изучающего язык.

Должно ли Ant писать int number = '0'; и задаться вопросом, почему он хранит номер 48, потому что его компилятор следует за преобразованием ASCII. Это полезно и полезно для человека, изучающего основы C. Покажите мне компилятор, который этого не делает, это не какая-то неясная редкость, и я с удовольствием оставлю это на этом, но я думаю чаще не SO означает педантизм над полезными ответами.

Тем не менее, все же хорошо, что никогда не использовать фактические представления чисел. То есть, всегда предпочитайте писать "0" за 48. Но приятно знать, почему "0" , скорее всего, представлено числом 48.

Ответ 11

Этот (ужасный) код отображает значения ASCII цифр 0..9 на индексы с нулевым основанием. '0' имеет тип char, который является числовым. Числовое значение '0' обычно 48. Вычитание 48 из char, представляющего цифру, даст вам значение char.

Ответ 12

Это способ преобразования значения ascii чего-то в его число. В C значение ascii char '0' равно 48. Таким образом, вычитая:

'0' - '0' = 0
'1' - '0' = 1
 ...
 c - '0' = <whatever the decimal number of c is>

Удобно, чтобы приращение десятичного числа ASCII было последовательным, иначе этот трюк не будет работать. Другими словами, c должен быть одним из "0".. '9', чтобы это работало. Это объясняет ограничение:

if(c>='0' && c<='9')