常量與變量
關鍵字
數據類型
數據類型的作用:編譯器預算對象(變量)分配的內存空間大小。
常量
常量:
- 在程序運行過程中,其值不能被改變的量
- 常量一般出現在表達式或賦值語句中
整型常量 | 100,200,-100,0 |
---|---|
實型常量 | 3.14 , 0.125,-3.123 |
字符型常量 | ‘a’,‘b’,‘1’,‘\n’ |
字符串常量 | “a”,“ab”,“12356” |
變量
- 變量
變量:
- 在程序運行過程中,其值可以改變
- 變量在使用前必須先定義,定義變量前必須有相應的數據類型
標識符命名規則:
- 標識符不能是關鍵字
- 標識符只能由字母、數字、下劃線組成
- 第一個字符必須爲字母或下劃線
- 標識符中字母區分大小寫
變量特點:
- 變量在編譯時爲其分配相應的內存空間
- 可以通過其名字和地址訪問相應內存
- 聲明和定義區別
- 聲明變量不需要建立存儲空間,如:extern int a;
- 定義變量需要建立存儲空間,如:int b;
#include <stdio.h>
int main()
{
//extern 關鍵字只做聲明,不能做任何定義,後面還會學習,這裏先了解
//聲明一個變量a,a在這裏沒有建立存儲空間
extern int a;
a = 10; //err, 沒有空間,就不可以賦值
int b = 10; //定義一個變量b,b的類型爲int,b賦值爲10
return 0;
}
從廣義的角度來講聲明中包含着定義,即定義是聲明的一個特例,所以並非所有的聲明都是定義:
- int b 它既是聲明,同時又是定義
- 對於 extern b來講它只是聲明不是定義
一般的情況下,把建立存儲空間的聲明稱之爲“定義”,而把不需要建立存儲空間的聲明稱之爲“聲明”。
使用示例
#include <stdio.h>
#define MAX 10 //聲明瞭一個常量,名字叫MAX,值是10,常量的值一旦初始化不可改
int main()
{
int a; //定義了一個變量,其類型爲int,名字叫a
const int b = 10; //定義一個const常量,名爲叫b,值爲10
//b = 11; //err,常量的值不能改變
//MAX = 100; //err,常量的值不能改變
a = MAX;//將abc的值設置爲MAX的值
a = 123;
printf("%d\n", a); //打印變量a的值
return 0;
}
進制
進制也就是進位制,是人們規定的一種進位方法。 對於任何一種進制—X進制,就表示某一位置上的數運算時是逢X進一位。 十進制是逢十進一,十六進制是逢十六進一,二進制就是逢二進一,以此類推,x進制就是逢x進位。
十進制 | 二進制 | 八進制 | 十六進制 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
二進制
二進制是計算技術中廣泛採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數爲2,進位規則是“逢二進一”,借位規則是“借一當二”。
當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。
術語 | 含義 |
---|---|
bit(比特) | 一個二進制代表一位,一個位只能表示0或1兩種狀態。數據傳輸是習慣以“位”(bit)爲單位。 |
Byte(字節) | 一個字節爲8個二進制,稱爲8位,計算機中存儲的最小單位是字節。數據存儲是習慣以“字節”(Byte)爲單位。 |
WORD(雙字節) | 2個字節,16位 |
DWORD | 兩個WORD,4個字節,32位 |
1b | 1bit,1位 |
1B | 1Byte,1字節,8位 |
1k,1K | 1024 |
1M(1兆) | 1024k, 1024*1024 |
1G | 1024M |
1T | 1024G |
1Kb(千位) | 1024bit,1024位 |
1KB(千字節) | 1024Byte,1024字節 |
1Mb(兆位) | 1024Kb = 1024 * 1024bit |
1MB(兆字節) | 1024KB = 1024 * 1024Byte |
十進制轉化二進制的方法:用十進制數除以2,分別取餘數和商數,商數爲0的時候,將餘數倒着數就是轉化後的結果。
十進制的小數轉換成二進制:小數部分和2相乘,取整數,不足1取0,每次相乘都是小數部分,順序看取整後的數就是轉化後的結果。
八進制
八進制,Octal,縮寫OCT或O,一種以8爲基數的計數法,採用0,1,2,3,4,5,6,7八個數字,逢八進1。一些編程語言中常常以數字0開始表明該數字是八進制。
八進制的數和二進制數可以按位對應(八進制一位對應二進制三位),因此常應用在計算機語言中。
十進制轉化八進制的方法:
用十進制數除以8,分別取餘數和商數,商數爲0的時候,將餘數倒着數就是轉化後的結果。
十六進制
十六進制(英文名稱:Hexadecimal),同我們日常生活中的表示法不一樣,它由0-9,A-F組成,字母不區分大小寫。與10進制的對應關係是:0-9對應0-9,A-F對應10-15。
十六進制的數和二進制數可以按位對應(十六進制一位對應二進制四位),因此常應用在計算機語言中。
十進制轉化十六進制的方法:
用十進制數除以16,分別取餘數和商數,商數爲0的時候,將餘數倒着數就是轉化後的結果。
C語言如何表示相應進制數
十進制 | 以正常數字1-9開頭,如123 |
---|---|
八進制 | 以數字0開頭,如0123 |
十六進制 | 以0x開頭,如0x123 |
二進制 | C語言不能直接書寫二進制數 |
#include <stdio.h>
int main()
{
int a = 123; //十進制方式賦值
int b = 0123; //八進制方式賦值, 以數字0開頭
int c = 0xABC; //十六進制方式賦值
//如果在printf中輸出一個十進制數那麼用%d,八進制用%o,十六進制是%x
printf("十進制:%d\n",a );
printf("八進制:%o\n", b); //%o,爲字母o,不是數字
printf("十六進制:%x\n", c);
return 0;
}
計算機內存數值存儲方式
原碼
一個數的原碼(原始的二進制碼)有如下特點:
- 最高位做爲符號位,0表示正,爲1表示負
- 其它數值部分就是數值本身絕對值的二進制數
- 負數的原碼是在其絕對值的基礎上,最高位變爲1
下面數值以1字節的大小描述:
十進制數 | 原碼 |
---|---|
+15 | 0000 1111 |
-15 | 1000 1111 |
+0 | 0000 0000 |
-0 | 1000 0000 |
原碼錶示法簡單易懂,與帶符號數本身轉換方便,只要符號還原即可,但當兩個正數相減或不同符號數相加時,必須比較兩個數哪個絕對值大,才能決定誰減誰,才能確定結果是正還是負,所以原碼不便於加減運算
反碼
- 對於正數,反碼與原碼相同
- 對於負數,符號位不變,其它部分取反(1變0,0變1)
十進制數 | 反碼 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0000 |
+0 | 0000 0000 |
-0 | 1111 1111 |
反碼運算也不方便,通常用來作爲求補碼的中間過渡。
補碼
在計算機系統中,數值一律用補碼來存儲。
補碼特點:
- 對於正數,原碼、反碼、補碼相同
- 對於負數,其補碼爲它的反碼加1
- 補碼符號位不動,其他位求反,最後整個數加1,得到原碼
十進制數 | 補碼 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0001 |
+0 | 0000 0000 |
-0 | 0000 0000 |
#include <stdio.h>
int main()
{
int a = -15;
printf("%x\n", a);
//結果爲 fffffff1
//fffffff1對應的二進制:1111 1111 1111 1111 1111 1111 1111 0001
//符號位不變,其它取反:1000 0000 0000 0000 0000 0000 0000 1110
//上面加1:1000 0000 0000 0000 0000 0000 0000 1111 最高位1代表負數,就是-15
return 0;
}
補碼的意義
示例1:用8位二進制數分別表示+0和-0
十進制數 | 原碼 |
---|---|
+0 | 0000 0000 |
-0 | 1000 0000 |
十進制數 | 反碼 |
---|---|
+0 | 0000 0000 |
-0 | 1111 1111 |
不管以原碼方式存儲,還是以反碼方式存儲,0也有兩種表示形式。爲什麼同樣一個0有兩種不同的表示方法呢?
但是如果以補碼方式存儲,補碼統一了零的編碼:
十進制數 | 補碼 |
---|---|
+0 | 0000 0000 |
-0 | 10000 0000由於只用8位描述,最高位1丟棄,變爲0000 0000 |
示例2:計算9-6的結果
以原碼方式相加:
十進制數 | 原碼 |
---|---|
9 | 0000 1001 |
-6 | 1000 0110 |
結果爲-15,不正確。
以補碼方式相加:
十進制數 | 補碼 |
---|---|
9 | 0000 1001 |
-6 | 1111 1010 |
最高位的1溢出,剩餘8位二進制表示的是3,正確。
在計算機系統中,數值一律用補碼來存儲,主要原因是:
- 統一了零的編碼
- 將符號位和其它位統一處理
- 將減法運算轉變爲加法運算
- 兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄
sizeof關鍵字
- sizeof不是函數,所以不需要包含任何頭文件,它的功能是計算一個數據類型的大小,單位爲字節
- sizeof的返回值爲size_t
- size_t類型在32位操作系統下是unsigned int,是一個無符號的整數
#include <stdio.h>
int main()
{
int a;
int b = sizeof(a);//sizeof得到指定值佔用內存的大小,單位:字節
printf("b = %d\n", b);
size_t c = sizeof(a);
printf("c = %u\n", c);//用無符號數的方式輸出c的值
return 0;
}
整型:int
整型變量的定義和輸出
打印格式 | 含義 |
---|---|
%d | 輸出一個有符號的10進制int類型 |
%o(字母o) | 輸出8進制的int類型 |
%x | 輸出16進制的int類型,字母以小寫輸出 |
%X | 輸出16進制的int類型,字母以大寫寫輸出 |
%u | 輸出一個10進制的無符號數 |
#include <stdio.h>
int main()
{
int a = 123; //定義變量a,以10進制方式賦值爲123
int b = 0567; //定義變量b,以8進制方式賦值爲0567
int c = 0xabc; //定義變量c,以16進制方式賦值爲0xabc
printf("a = %d\n", a);
printf("8進制:b = %o\n", b);
printf("10進制:b = %d\n", b);
printf("16進制:c = %x\n", c);
printf("16進制:c = %X\n", c);
printf("10進制:c = %d\n", c);
unsigned int d = 0xffffffff; //定義無符號int變量d,以16進制方式賦值
printf("有符號方式打印:d = %d\n", d);
printf("無符號方式打印:d = %u\n", d);
return 0;
}
整型變量的輸入
#include <stdio.h>
int main()
{
int a;
printf("請輸入a的值:");
//不要加“\n”
scanf("%d", &a);
printf("a = %d\n", a); //打印a的值
return 0;
}
short、int、long、long long
數據類型 | 佔用空間 |
---|---|
short(短整型) | 2字節 |
int(整型) | 4字節 |
long(長整形) | Windows爲4字節,Linux爲4字節(32位),8字節(64位) |
long long(長長整形) | 8字節 |
注意:
- 需要注意的是,整型數據在內存中佔的字節數與所選擇的操作系統有關。雖然 C 語言標準中沒有明確規定整型數據的長度,但 long 類型整數的長度不能短於 int 類型, short 類型整數的長度不能短於 int 類型。
- 當一個小的數據類型賦值給一個大的數據類型,不會出錯,因爲編譯器會自動轉化。但當一個大的類型賦值給一個小的數據類型,那麼就可能丟失高位。
整型常量 | 所需類型 |
---|---|
10 | 代表int類型 |
10l, 10L | 代表long類型 |
10ll, 10LL | 代表long long類型 |
10u, 10U | 代表unsigned int類型 |
10ul, 10UL | 代表unsigned long類型 |
10ull, 10ULL | 代表unsigned long long類型 |
打印格式 | 含義 |
---|---|
%hd | 輸出short類型 |
%d | 輸出int類型 |
%l | 輸出long類型 |
%ll | 輸出long long類型 |
%hu | 輸出unsigned short類型 |
%u | 輸出unsigned int類型 |
%lu | 輸出unsigned long類型 |
%llu | 輸出unsigned long long類型 |
#include <stdio.h>
int main()
{
short a = 10;
int b = 10;
long c = 10l; //或者10L
long long d = 10ll; //或者10LL
printf("sizeof(a) = %u\n", sizeof(a));
printf("sizeof(b) = %u\n", sizeof(b));
printf("sizeof(c) = %u\n", sizeof(c));
printf("sizeof(c) = %u\n", sizeof(d));
printf("short a = %hd\n", a);
printf("int b = %d\n", b);
printf("long c = %ld\n", c);
printf("long long d = %lld\n", d);
unsigned short a2 = 20u;
unsigned int b2 = 20u;
unsigned long c2= 20ul;
unsigned long long d2 = 20ull;
printf("unsigned short a = %hu\n", a2);
printf("unsigned int b = %u\n", b2);
printf("unsigned long c = %lu\n", c2);
printf("unsigned long long d = %llu\n", d2);
return 0;
}
有符號數和無符號數區別
- 有符號數
有符號數是最高位爲符號位,0代表正數,1代表負數。
#include <stdio.h>
int main()
{
signed int a = -1089474374; //定義有符號整型變量a
printf("%X\n", a); //結果爲 BF0FF0BA
//B F 0 F F 0 B A
//1011 1111 0000 1111 1111 0000 1011 1010
return 0;
}
- 無符號數
無符號數最高位不是符號位,而就是數的一部分,無符號數不可能是負數。
#include <stdio.h>
int main()
{
unsigned int a = 3236958022; //定義無符號整型變量a
printf("%X\n", a); //結果爲 C0F00F46
return 0;
}
當我們寫程序要處理一個不可能出現負值的時候,一般用無符號數,這樣可以增大數的表達最大值。
- 有符號和無符號整型取值範圍
數據類型 | 佔用空間 | 取值範圍 |
---|---|---|
short | 2字節 | -32768 到 32767 (-215 ~ 215-1) |
int | 4字節 | -2147483648 到 2147483647 (-231 ~ 231-1) |
long | 4字節 | -2147483648 到 2147483647 (-231 ~ 231-1) |
unsigned short | 2字節 | 0 到 65535 (0 ~ 216-1) |
unsigned int | 4字節 | 0 到 4294967295 (0 ~ 232-1) |
unsigned long | 4字節 | 0 到 4294967295 (0 ~ 232-1) |
字符型:char
字符變量的定義和輸出
字符型變量用於存儲一個單一字符,在 C 語言中用 char 表示,其中每個字符變量都會佔用 1 個字節。在給字符型變量賦值時,需要用一對英文半角格式的單引號(’ ')把字符括起來。
字符變量實際上並不是把該字符本身放到變量的內存單元中去,而是將該字符對應的 ASCII 編碼放到變量的存儲單元中。char的本質就是一個1字節大小的整型。
#include <stdio.h>
int main()
{
char ch = 'a';
printf("sizeof(ch) = %u\n", sizeof(ch));
printf("ch[%%c] = %c\n", ch); //打印字符
printf("ch[%%d] = %d\n", ch); //打印‘a’ ASCII的值
char A = 'A';
char a = 'a';
printf("a = %d\n", a); //97
printf("A = %d\n", A); //65
printf("A = %c\n", 'a' - 32); //小寫a轉大寫A
printf("a = %c\n", 'A' + 32); //大寫A轉小寫a
ch = ' ';
printf("空字符:%d\n", ch); //空字符ASCII的值爲32
printf("A = %c\n", 'a' - ' '); //小寫a轉大寫A
printf("a = %c\n", 'A' + ' '); //大寫A轉小寫a
return 0;
}
ASCII對照表
ASCII值 | 控制字符 | ASCII值 | 字符 | ASCII值 | 字符 | ASCII值 | 字符 |
---|---|---|---|---|---|---|---|
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | " | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | / | 124 | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ` |
31 | US | 63 | ? | 95 | _ | 127 | DEL |
ASCII 碼大致由以下兩部分組成:
- ASCII 非打印控制字符: ASCII 表上的數字 0-31 分配給了控制字符,用於控制像打印機等一些外圍設備。
- ASCII 打印字符:數字 32-126 分配給了能在鍵盤上找到的字符,當查看或打印文檔時就會出現。數字 127 代表 Del 命令。
轉義字符
轉義字符 | 含義 | ASCII碼值(十進制) |
---|---|---|
\a | 警報 | 007 |
\b | 退格(BS) ,將當前位置移到前一列 | 008 |
\f | 換頁(FF),將當前位置移到下頁開頭 | 012 |
\n | 換行(LF) ,將當前位置移到下一行開頭 | 010 |
\r | 回車(CR) ,將當前位置移到本行開頭 | 013 |
\t | 水平製表(HT) (跳到下一個TAB位置) | 009 |
\v | 垂直製表(VT) | 011 |
\\ | 代表一個反斜線字符"\" | 092 |
\’ | 代表一個單引號(撇號)字符 | 039 |
\" | 代表一個雙引號字符 | 034 |
\? | 代表一個問號 | 063 |
\0 | 數字0 | 000 |
\ddd | 8進制轉義字符,d範圍0~7 | 3位8進制 |
\xhh | 16進制轉義字符,h範圍09,af,A~F | 3位16進制 |
注意:紅色字體標註的爲不可打印字符。
#include <stdio.h>
int main()
{
printf("abc");
printf("\refg\n"); //\r切換到句首, \n爲換行鍵
printf("abc");
printf("\befg\n");//\b爲退格鍵, \n爲換行鍵
printf("%d\n", '\123');// '\123'爲8進制轉義字符,0123對應10進制數爲83
printf("%d\n", '\x23');// '\x23'爲16進制轉義字符,0x23對應10進制數爲35
return 0;
}
數值溢出
當超過一個數據類型能夠存放最大的範圍時,數值會溢出。
有符號位最高位溢出的區別:符號位溢出會導致數的正負發生改變,但最高位的溢出會導致最高位丟失。
數據類型 | 佔用空間 | 取值範圍 |
---|---|---|
char | 1字節 | -128到 127(-27 ~ 27-1) |
unsigned char | 1字節 | 0 到 255(0 ~ 28-1) |
#include <stdio.h>
int main()
{
char ch;
//符號位溢出會導致數的正負發生改變
ch = 0x7f + 2; //127+2
printf("%d\n", ch);
// 0111 1111
//+2後 1000 0001,這是負數補碼,其原碼爲 1111 1111,結果爲-127
//最高位的溢出會導致最高位丟失
unsigned char ch2;
ch2 = 0xff+1; //255+1
printf("%u\n", ch2);
// 1111 1111
//+1後 10000 0000, char只有8位最高位的溢出,結果爲0000 0000,十進制爲0
ch2 = 0xff + 2; //255+1
printf("%u\n", ch2);
// 1111 1111
//+1後 10000 0001, char只有8位最高位的溢出,結果爲0000 0001,十進制爲1
return 0;
}
實型(浮點型):float、double
實型變量也可以稱爲浮點型變量,浮點型變量是用來存儲小數數值的。在C語言中, 浮點型變量分爲兩種: 單精度浮點數(float)、 雙精度浮點數(double), 但是double型變量所表示的浮點數比 float 型變量更精確。
數據類型 | 佔用空間 | 有效數字範圍 |
---|---|---|
float | 4字節 | 7位有效數字 |
double | 8字節 | 15~16位有效數字 |
由於浮點型變量是由有限的存儲單元組成的,因此只能提供有限的有效數字。在有效位以外的數字將被捨去,這樣可能會產生一些誤差。
不以f結尾的常量是double類型,以f結尾的常量(如3.14f)是float類型。
#include <stdio.h>
int main()
{
//傳統方式賦值
float a = 3.14f; //或3.14F
double b = 3.14;
printf("a = %f\n", a);
printf("b = %lf\n", b);
//科學法賦值
a = 3.2e3f; //3.2*1000 = 32000,e可以寫E
printf("a1 = %f\n", a);
a = 100e-3f; //100*0.001 = 0.1
printf("a2 = %f\n", a);
a = 3.1415926f;
printf("a3 = %f\n", a); //結果爲3.141593
return 0;
}
類型限定符
限定符 | 含義 |
---|---|
extern | 聲明一個變量,extern聲明的變量沒有建立存儲空間。extern int a; |
const | 定義一個常量,常量的值不能修改。const int a = 10; |
volatile | 防止編譯器優化代碼 |
register | 定義寄存器變量,提高效率。register是建議型的指令,而不是命令型的指令,如果CPU有空閒寄存器,那麼register就生效,如果沒有空閒寄存器,那麼register無效。 |
字符串格式化輸出和輸入
字符串常量
- 字符串是內存中一段連續的char空間,以’\0’(數字0)結尾。
- 字符串常量是由雙引號括起來的字符序列,如“china”、“C program”,“$12.5”等都是合法的字符串常量。
字符串常量與字符常量的不同:
每個字符串的結尾,編譯器會自動的添加一個結束標誌位’\0’,即 “a” 包含兩個字符’a’和’\0’。
printf函數和putchar函數
printf是輸出一個字符串,putchar輸出一個char。
printf格式字符:
打印格式 | 對應數據類型 | 含義 |
---|---|---|
%d | int | 接受整數值並將它表示爲有符號的十進制整數 |
%hd | short int | 短整數 |
%hu | unsigned short | 無符號短整數 |
%o | unsigned int | 無符號8進制整數 |
%u | unsigned int | 無符號10進制整數 |
%x,%X | unsigned int | 無符號16進制整數,x對應的是abcdef,X對應的是ABCDEF |
%f | float | 單精度浮點數 |
%lf | double | 雙精度浮點數 |
%e,%E | double | 科學計數法表示的數,此處"e"的大小寫代表在輸出時用的"e"的大小寫 |
%c | char | 字符型。可以把輸入的數字按照ASCII碼相應轉換爲對應的字符 |
%s | char * | 字符串。輸出字符串中的字符直至字符串中的空字符(字符串以’\0‘結尾,這個’\0’即空字符) |
printf附加格式:
字符 | 含義 |
---|---|
l(字母l) | 附加在d,u,x,o前面,表示長整數 |
- | 左對齊 |
m(代表一個整數) | 數據最小寬度 |
0(數字0) | 將輸出的前面補上0直到佔滿指定列寬爲止不可以搭配使用- |
m.n(代表一個整數) | m指域寬,即對應的輸出項在輸出設備上所佔的字符數。n指精度,用於說明輸出的實型數的小數位數。對數值型的來說,未指定n時,隱含的精度爲n=6位。 |
#include <stdio.h>
int main()
{
int a = 100;
printf("a = %d\n", a);//格式化輸出一個字符串
printf("%p\n", &a);//輸出變量a在內存中的地址編號
printf("%%d\n");
char c = 'a';
putchar(c);//putchar只有一個參數,就是要輸出的char
long a2 = 100;
printf("%ld, %lx, %lo\n", a2, a2, a2);
long long a3 = 1000;
printf("%lld, %llx, %llo\n", a3, a3, a3);
int abc = 10;
printf("abc = '%6d'\n", abc);
printf("abc = '%-6d'\n", abc);
printf("abc = '%06d'\n", abc);
printf("abc = '%-06d'\n", abc);
double d = 12.3;
printf("d = \' %-10.3lf \'\n", d);
return 0;
}
scanf函數與getchar函數
- getchar是從標準輸入設備讀取一個char。
- scanf通過%轉義的方式可以得到用戶通過標準輸入設備輸入的數據。
#include <stdio.h>
int main()
{
char ch1;
char ch2;
char ch3;
int a;
int b;
printf("請輸入ch1的字符:");
ch1 = getchar();
printf("ch1 = %c\n", ch1);
getchar(); //測試此處getchar()的作用
printf("請輸入ch2的字符:");
ch2 = getchar();
printf("\'ch2 = %ctest\'\n", ch2);
getchar(); //測試此處getchar()的作用
printf("請輸入ch3的字符:");
scanf("%c", &ch3);//這裏第二個參數一定是變量的地址,而不是變量名
printf("ch3 = %c\n", ch3);
printf("請輸入a的值:");
scanf("%d", &a);
printf("a = %d\n", a);
printf("請輸入b的值:");
scanf("%d", &b);
printf("b = %d\n", b);
return 0;
}