使用char变量的减号运算符

时间:2011-10-11 07:45:00

标签: c gcc

这是非常微不足道的,但我没有得到它。

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 个答案:

答案 0 :(得分:6)

a[]包含您输入的字符串"2345"时,表达式a[1]是字符'3'的字符代码。由于您使用的是ASCII作为基础编码(根据您获得的代码,虽然标准并未严格规定),但'0''9'字符由小数值{表示{ {1}}至48(十六进制570x30)。

换句话说,你有:

0x39

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 | 

在使用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 的第二种情况下,"abhi"等于a[1],如果您检查上面的表,则为字符代码b十进制(十六进制{{1} }})。

对于减去98的输出行,实际上减去0x62的字符代码,即十进制'0''0'十六进制。

答案 1 :(得分:1)

这将返回在第二个位置输入的数字的ascii代码,然后返回此数字的值。

如果为'0',则返回48然后返回0.

如果是'1',它将返回49 1,依此类推。

如果您使用的字符不是数字,它将返回其ascii代码,然后返回其ascii代码与ascii代码“0”的差异

基本上,角色的操作(+ - ...)将对其ascii代码进行操作:see here。 所以基本上a[1] - '0'将返回键入的第二个字符的整数值。

这用于将用户输入转换为atoi()函数中的整数。

答案 2 :(得分:1)

这:http://www.asciitable.com/是ascii表 在你的第一次尝试中你得到51,因为它是'3'(char 3)ascii值 在第二次尝试中你得到50,因为'b'= 98而'0'= 48所以'b' - '0'= 50。

答案 3 :(得分:0)

  • 第一个原因:51是'3'的ascii值(即[1])
  • 第二个原因:98是'b'的ascii值,48是ascii值'0'98 - 48 = 50

我看到你正在使用linux。命令“ascii”打印出ascii表。