# 單引號
## 實驗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`。