2015-01-29 1 views
0

Я нашел этот примерный код при использовании массивов на языке C.Массивы K & R 1.6 // Представление цифр в конструкции массива

#include <stdio.h> 

main() { 
    int c, i; 
    int ndigit[10]; 

for (i = 0; i < 10; ++i) 
    ndigit[i]=0; 

while ((c = getchar()) != EOF) 
    if (c >= '0' && c <= '9') 
     ++ndigit[c - '0']; 

printf("digits ="); 
for (i = 0; i < 10; ++i) 
    printf(" %d", ndigit[i]); 
} 

Я никогда не видел массивы раньше, но я думаю, что получил. Тем не менее, я не уверен, почему значения цифр должны быть вставлены в '..' или почему назначение i должно быть выражено как c-'0'.

Это отрывок из книги, которая должна прояснить мои сомнения:

Эта particolar программа опирается на свойства символьного представления цифр. Например, текст if (c >= '0' && c <= '9') определяет, являются ли символы в c цифрой. Если это так, числовое значение, если эта цифра равна c - '0'.

Я не понимаю, как эти значения могут использоваться в арифметических выражениях, если они являются символами, потому что они отображаются на числовые значения?

Тогда почему вся программа просто не будет работать, если они записаны в виде чисел, как и в if (c >= 0 && c <= 9), ни она работает, если c не написано таким образом (который к моему пониманию это просто «любой номер c минус 0) .

+0

возможно дубликат [Что реальное применение с использованием п \ [C-'0' \]?] (Http://stackoverflow.com/ Вопросы/7403741/whats-the-real-use-of-use-nc-0) – usr2564301

ответ

3

TL; DR: «char» - всего однобайтовое целое число.

Я не понимаю, как эти значения могут использоваться в арифметических выражениях, если они являются символами, потому что они отображаются на числовые значения?

В C символ - это «наименьшая адресуемая единица устройства, которая может содержать базовый набор символов». Это целочисленный тип ». [1]. Обычно char эквивалентен «однобайтовому целому числу», поэтому они могут содержать значения от 0 до (2^8) -1 или [0,255].

Это, как говорится, когда вы пишете

char c = '9'; 

Вы говорите «с представляет собой один байт-длинное целое, значение которого является символьный набор представление символа 9». Глядя на наиболее общем наборе символов, таблица ASCII [2], мы видим, что характер 9 имеет целочисленное значение 57, так что приведенное выше выражение эквивалентно

char c = 57; 

Для преобразования символьного набора цифры в значение для самой цифры (например, от 9 до 9 или от 57 до 9), вы можете полагаться на свойство наборов символов, что цифры всегда сохраняются последовательно и все чаще и просто вычитаются на значение «0», которое в ASCII является 48, так:

char c; 
c = '9' - '0'; /* = 9 In any character set */ 
c = 57 - 48; /* = 9 */ 
c = '9' - 48; /* = 9 In ASCII */ 
c = 57 - '0'; /* = 9 In ASCII */ 

Имейте в виду, что в то время как ASCII является наиболее распространенным набор символов, это на самом деле машинно-зависимая.

[1] http://en.wikipedia.org/wiki/C_data_types#Basic_types

[2] http://www.asciitable.com/

+0

«... только те, что в таблице ASCII, могут быть напечатаны в качестве символов». Неа. Как вы думаете, что произойдет, если я попытаюсь напечатать значение 5 как символ? –

+0

Не равный C для ASCII. Нет причин, кроме, да, по общему признанию, это * наиболее часто используемый *, но тем не менее вы можете сказать «В Windows Codepage 1252 ...» – usr2564301

+0

@CoolGuy: ну, это зависит ... какая у вас ОС ? Компилятор? Кодировка символов? (Что точно * почему никто не должен упоминать «ASCII» - это не имеет значения * к вопросу OP.) – usr2564301

2

если вы видите страницу человека getchar() это говорит

.... читает следующий символ из стандартного ввода и возвращает его в качестве unsigned char броска к int ....

Таким образом, ввод в цифр [например, 9] рассматривается как char вход и соответствующий закодированный [Обычно ASCII-] значение возвращается getchar().

Сейчас подходит к вашему вопрос (ы),

почему значные значения должны быть вставлены в '..'

A цифры [или любой другой символ, для этого вещество], записанное как '.', представляет соответствующее значение ASCII того же самого. Проверьте таблицу ASCII here.

Для понимания, 9 является 9, тогда как '9' представляет собой корреспондирующий ASCII 57.

Почему назначение i должно быть выражено как c-'0 '.

Если вы заметили таблицу ASCII внимательно, вы можете видеть, соответствующие значения 0 к 9 в последовательности.Таким образом, чтобы получить конкретную цифру , какint значение, мы можем сделать c - '0', которая так же, как c - 48, который даст нам цифру , какint.

+0

Фактически «в кодировке, используемой компилятором» (спецификация не упоминает или не рекомендует определенную кодировку, кроме некоторых ограничений) , – usr2564301

+0

«Цифра, написанная как ..» Нет. Это не ограничивается * цифрами *. – usr2564301

+0

@ Jongware Я получил вашу точку зрения, мой выбор слов неправильный. Можете ли вы предложить, как правильно заявить об этом? –

1

Я не понимаю, как эти значения могут быть использованы в арифметических выражениях , если они являются символами, это потому, что они отображаются в числовых значения?

getchar() возвращает read.Prototype символов для него

int getchar(void) 

Когда персонаж чтения getchar() возвращает значение ASCII из полукокса чтения.

Значение ASCII для символов от 0 до 9 является смежным. Так что просто используйте его, если у нас есть

char ch = '5'; 
int i = ch - '0'; /* 53 - 48 = 5 */ 

даст вам целочисленное значение 5. Преобразование символа в целое. Арифметика выполняется неявным преобразованием.

Если у вас есть символ «8», то это не дает вам целое значение 8 но Retuns значения ASCII 56. Таким образом, во время арифметических ch - '0', поскольку оба Чара соответствующих значений ASCII используются и арифметическая операция выполняется

+0

Разве вы не должны указывать на * символ * нотация не ограничивается цифрами? Кажется, что они думают, что они связаны. – usr2564301

+0

@Jongware Комментировать часть не помогает? – Gopi

+0

Нет, между '8' и' '8'' нет никакой связи, кроме того, что кодировка, обозначенная символом' '8'', представляет собой определенный символ с этим значением. Он не имеет «числового» значения - сравнивается с «А», который также является символом, но не числом. Числовая ссылка между '' 8'' и '8' * создана * в коде OP. Вы можете создать аналогичную ссылку для «A..J». – usr2564301

Смежные вопросы