Оператор минус с переменной char - PullRequest
1 голос
/ 11 октября 2011

Это очень тривиально, но я не понимаю.

shadyabhi@archlinux /tmp $ ./a.out 
2345
51  <-- **Why?**
3
shadyabhi@archlinux /tmp $ ./a.out 
abhi
98
50  <-- **Why?**
shadyabhi@archlinux /tmp $ cat main.c 
#include <stdio.h>

int main()
{
    char a[10];
    scanf("%s", a);
    printf("%d\n", a[1]);
    printf("%d\n", a[1] - '0');
    return 0;
}
shadyabhi@archlinux /tmp $ 

Ответы [ 4 ]

6 голосов
/ 11 октября 2011

Если a[] содержит введенную вами строку "2345", то выражение a[1] является кодом символа '3'.Поскольку вы используете ASCII в качестве базовой кодировки (на основе кодов, которые вы получаете, хотя это не является строго обязательным в соответствии со стандартом), символы '0' через '9' представлены десятичными значениями 48 через 57 (hex 0x30 через 0x39).

Другими словами, у вас есть:

a[0] = '2'  = 0x32 = 50
a[1] = '3'  = 0x33 = 51
a[2] = '4'  = 0x34 = 52
a[3] = '5'  = 0x35 = 53
a[4] = '\0' = 0x00 =  0

Таблица ASCII:

    | Dec Hex Chr | Dec Hex Chr | Dec Hex Chr | Dec Hex Chr | 
    |   0  00 NUL |  32  20     |  64  40  @  |  96  60  `  | 
    |   1  01 SOH |  33  21  !  |  65  41  A  |  97  61  a  | 
    |   2  02 STX |  34  22  "  |  66  42  B  |  98  62  b  | 
    |   3  03 ETX |  35  23  #  |  67  43  C  |  99  63  c  | 
    |   4  04 EOT |  36  24  $  |  68  44  D  | 100  64  d  | 
    |   5  05 ENQ |  37  25  %  |  69  45  E  | 101  65  e  | 
    |   6  06 ACK |  38  26  &  |  70  46  F  | 102  66  f  | 
    |   7  07 BEL |  39  27  '  |  71  47  G  | 103  67  g  | 
    |   8  08 BS  |  40  28  (  |  72  48  H  | 104  68  h  | 
    |   9  09 HT  |  41  29  )  |  73  49  I  | 105  69  i  | 
    |  10  0A LF  |  42  2A  *  |  74  4A  J  | 106  6A  j  | 
    |  11  0B VT  |  43  2B  +  |  75  4B  K  | 107  6B  k  | 
    |  12  0C FF  |  44  2C  ,  |  76  4C  L  | 108  6C  l  | 
    |  13  0D CR  |  45  2D  -  |  77  4D  M  | 109  6D  m  | 
    |  14  0E SO  |  46  2E  .  |  78  4E  N  | 110  6E  n  | 
    |  15  0F SI  |  47  2F  /  |  79  4F  O  | 111  6F  o  | 
    |  16  10 DLE |  48  30  0  |  80  50  P  | 112  70  p  | 
    |  17  11 DC1 |  49  31  1  |  81  51  Q  | 113  71  q  | 
    |  18  12 DC2 |  50  32  2  |  82  52  R  | 114  72  r  | 
    |  19  13 DC3 |  51  33  3  |  83  53  S  | 115  73  s  | 
    |  20  14 DC4 |  52  34  4  |  84  54  T  | 116  74  t  | 
    |  21  15 NAK |  53  35  5  |  85  55  U  | 117  75  u  | 
    |  22  16 SYN |  54  36  6  |  86  56  V  | 118  76  v  | 
    |  23  17 ETB |  55  37  7  |  87  57  W  | 119  77  w  | 
    |  24  18 CAN |  56  38  8  |  88  58  X  | 120  78  x  | 
    |  25  19 EM  |  57  39  9  |  89  59  Y  | 121  79  y  | 
    |  26  1A SUB |  58  3A  :  |  90  5A  Z  | 122  7A  z  | 
    |  27  1B ESC |  59  3B  ;  |  91  5B  [  | 123  7B  {  | 
    |  28  1C FS  |  60  3C  <  |  92  5C  \  | 124  7C  |  | 
    |  29  1D GS  |  61  3D  =  |  93  5D  ]  | 125  7D  }  | 
    |  30  1E RS  |  62  3E  >  |  94  5E  ^  | 126  7E  ~  | 
    |  31  1F US  |  63  3F  ?  |  95  5F  _  | 127  7F DEL | 

Inвторой случай с "abhi", a[1] равен b, который, если вы посмотрите на приведенную выше таблицу, представляет собой код символа 98 десятичный (шестнадцатеричный 0x62).

Для выходных строкгде вы вычитаете '0', это фактически вычитает код символа для '0', который является десятичным 48 или 0x30 шестнадцатеричным.

1 голос
/ 11 октября 2011

Это: http://www.asciitable.com/ - таблица ascii.
с первой попытки вы получили 51, потому что это «3» (char 3) значение ascii.
во второй попытке вы получили 50, потому что «b» = 98 и «0» = 48, поэтому «b» - «0» = 50.

1 голос
/ 11 октября 2011

Это вернет код ascii числа, введенного во второй позиции, а затем значение этого числа.

Если это «0», вернется 48, а затем 0.

Если это «1», он вернет 49 1 и т. Д.

Если вы используете символ, который не является числом, он вернет свой код ascii, тогда разница его кода ascii и кода ascii'0'

В основном операция (+ - ...) над символом будет работать с его кодами ascii: см. Здесь .Таким образом, в основном a[1] - '0' будет возвращать целочисленное значение второго введенного символа.

Используется для преобразования пользовательского ввода в целые числа, как в функции atoi ().

0 голосов
/ 11 октября 2011
  • сначала почему: 51 - это значение ascii '3' (которое является [1])
  • второй почему: 98 - это значение ascii 'b', а 48 - значение ascii'0' 98 - 48 = 50

Я вижу, вы используете Linux.Команда «ascii» выводит на экран таблицу ascii.

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