Что означает «0» в строке 41? - PullRequest
1 голос
/ 16 декабря 2009
#include <iostream>
#include <cctype> // isdigit
using namespace std;

// Global buffer
const int LINE_LENGTH = 128;
char line[LINE_LENGTH];
int lineIndex;

void getLine () {
// Get a line of characters.
// Install a newline character as sentinel.
   cin.getline (line, LINE_LENGTH);
   line[cin.gcount () - 1] = '\n';
   lineIndex = 0;
}

enum State {eI, eF, eM, eSTOP};

void parseNum (bool& v, int& n) {
   int sign;
   State state;
   char nextChar;
   v = true;
   state = eI;

   do {
      nextChar = line[lineIndex++];
      switch (state) {
         case eI:
            if (nextChar == '+') {
               sign = +1;
               state = eF;
            }
            else if (nextChar == '-') {
               sign = -1;
               state = eF;
            }
            else if (isdigit (nextChar)) {
               sign = +1;
               n = nextChar - '0'; // line 41
               state = eM;
            }
            else {
               v = false;
            }
            break;
         case eF:
            if (isdigit (nextChar)) {
               n = nextChar - '0';
               state = eM;
            }
            else {
               v = false;
            }
            break;
         case eM:
            if (isdigit (nextChar)) {
               n = 10 * n + nextChar - '0';
            }
            else if (nextChar == '\n') {
               n = sign * n;
               state = eSTOP;
            }
            else {
               v = false;
            }
            break;
      }
   }
   while ((state != eSTOP) && v);
}

int main () {
   bool valid;
   int num;
   cout << "Enter number: ";
   getLine();
   parseNum (valid, num);
   if (valid) {
      cout << "Number = " << num << endl;
   }
   else {
      cout << "Invalid entry." << endl;
   }
   return 0;
}

Что означает «0» в строке 41? Эта строка присваивает n следующий символ минус первый символ nextChar?

Ответы [ 6 ]

7 голосов
/ 16 декабря 2009

nextChar - '0' возвращает целочисленное значение символа. Например, если символьное значение равно «1» (это ASCII 0x31), то если вы вычтете «0» (что 0x30), вы получите значение 1. Поскольку значения ASCII «0» - «9» являются непрерывными, техника будет работать.

5 голосов
/ 16 декабря 2009

Преобразует число (в ASCII), указанное в nextChar, в его фактическое значение. Таким образом, если значение ASCII равно 5, вычитание 0 из 5 дает числовое значение 5.

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

3 голосов
/ 16 декабря 2009

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

«0» отличается от 0 тем, что «0» - это ASCII, а 0 - «0». Взгляните на ASCII стандарт . Символ «0» - это значение 48. Линия

n = nextChar - '0';

может быть написано так же легко, как

n = nextChar - 48

В строке выполняется своего рода преобразование ASCII-представления цифры в фактическое целочисленное представление.

2 голосов
/ 16 декабря 2009

Преобразует из кода ASCII, соответствующего цифре, в само число.

Таким образом, он возьмет символ '1' и даст вам число 1. И так далее для других цифр.

1 голос
/ 16 декабря 2009

Предполагая, что c является char между '0' и '9'

По определению, символы просто маленькие целые числа, так что переменные и символы константы идентичны целым в арифметические выражения. Это естественно и удобно; например c-'0 'является целочисленным выражением с значение от 0 до 9, соответствующее символ от '0' до '9' хранится в c. Керниган и Ричи

1 голос
/ 16 декабря 2009

'0' возвращает код ascii для символа 0 (а именно 48). он позволяет легко переводить между числовым значением (например, 7) и его эквивалентом (который равен 55, как вы можете видеть здесь ): 7 + '0' = 7 + 48 = 55

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...