# 单引号 ## 实验1 ```c #include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) { char mask[1]; memset(mask, 0, 1); mask[0] = 1; printf("%c\t%d\n",mask[0],mask[0]); mask[0] = '1'; printf("%c\t%d\n",mask[0],mask[0]); mask[0] = 49; printf("%c\t%d\n",mask[0],mask[0]); return 0; } ``` 结果为 ``` 1 1 49 1 49 ``` ``` %c 输出一个字符 %d 整型输出 ``` 第一种情况,直接存的是`1`,而根据 ascii 表`1`代表的可不见字符`soh` ``` 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del ``` 而第二种情况则是存的`'1'`,用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值。而一般我们的编译器采用的都是ASCII字符集。因此'1'的含义其实和十进制数`49`的含义是一致的。 ## 实验2 > 转成更容易理解的思路,char 存`1~127`的数字,`'1'`表示单引号计算出 ascii 表里面的`1`对应的数值(49) ```c #include <stdio.h> #include <string.h> int main(int argc, char const *argv[]) { if('1' == 49){ printf("还有这种操作\n" ); } return 0; } ``` 是相同的哟!所以第二种情况和第三种情况是等价的。 # 双引号 ```c char *c = "abcdef"; ``` 双引号做了3件事: - 在常量区申请内存,存放字符串 - 在字符串尾加上了'/0' - 返回字符串的首地址 所以这里的赋值操作是将`abcdef\0`的首地址赋值给了`c`。