<!--scanf printf 不負責-->
這裏重申格式說明符的做用以及重要性 能夠跳過spa
考慮以下代碼
int n;
scanf("%c", &n);
printf("%c\n", n);
在這裏咱們將n當作了char型變量 而不是int 可是你會發現編譯經過了 而且運行結果也沒有問題
內存
再作一個改變
int n;
scanf("%d", &n); // %c -> %d
printf("%c\n", n);
這時候咱們輸入65 程序會輸出A 由於65是A的ASCII碼
相反 咱們若是改爲這樣
int n;
scanf("%c", &n);
printf("%d\n", n);
咱們輸入A 程序就會輸出 65
看得出來 不管是scanf仍是printf 它們在給變量獲取輸入或者打印輸出的時候 不會明白這個變量自己的類型 而是須要藉助格式說明符
若是你想從中做梗 違反規則 編譯器不會知道
char ch;
scanf("%d", &ch);
你以%d對應着一個char類型變量的地址 scanf就會覺得這個char變量是一個int型變量
可是這存在隱患 由於若是你輸入的數足夠大 大到一字節裝不下(char類型是一字節) 那麼將會覆蓋掉其餘內存
scanf告訴你「既然你認爲它是一個四字節的int變量 那麼它就該存的下足夠大的值」
而事實上溢出了 超出的部分覆蓋掉的內存可能已被其餘變量佔用 也多是更危險的地帶 這將致使程序出錯甚至崩潰
所以請記住 printf和scanf不會明白你要打印或者獲取的變量到底是什麼類型 一切由格式說明符負責
編譯器