黑马程序员C语言基础(第四天)数据类型
https://www.bilibili.com/video/BV15W411K7k6?p=65&spm_id_from=pageDriver
文章目錄
- 數據類型
- 常量與變量
- 關鍵字
- 數據類型
- 常量
- 變量 (extern關鍵字)
- 使用示例(宏定義(Macro definition):#define )(常量:const關鍵字)
- 進制
- 二進制
- 八進制
- 十六進制
- C語言如何表示相應進制數(八進制以0開頭,十六進制以0x開頭)(以不同進制打印:十進制(%d)、八進制(%o)、十六進制(%x))
- 計算機內存數值存儲方式
- 原碼
- 反碼
- 補碼
- 對二進制數來說,先減1后取反和先取反后加1得到的結果是一樣的(對上面代碼的解釋)
- 補碼的意義(對計算機存儲友好:可存儲負數,也能統一 +0 與 -0 的表達)
- C語言原碼、補碼、反碼示例
- 示例1
- 示例2
- 示例3(當為8進制或16進制表示時,計算機看到的和輸出的都是補碼)
- 示例4:自動擴展位?(沒搞懂什么時候會自動擴展什么時候不會。.。。)
- sizeof關鍵字(不是函數,只是個運算符)(計算數據類型大小)(有時有坑)
- 整型:int
- 整型變量的定義和輸出 (%d、%o、%x、%X、%u)
- 整型變量的輸入(scanf取地址&)
- short、int、long、long long(短整型 short %hd)
- 有符號數和無符號數區別
- 1) 有符號數(signed int a = -10; 相當于int a = -10;)
- 2) 無符號數(當有符號數的正數來處理)
- 3) 有符號和無符號整型取值范圍
- 邊緣值示例
- 字符型:char(注意加單引號表示Ascii,其他不加或雙引號跟其他如int、string用法類似)
- 字符變量的定義和輸出
- 字符變量的輸入 scanf
- ASCII對照表(略,自己上網查)
- 轉義字符 \n \r \b等 ('\123'為8進制轉義字符,'\x23'為16進制轉義字符)
- 數值溢出
- 實型(浮點型):float、double(能不用則不用,值有時候不準確)
- 類型限定符 extern const volatile register
- 字符串格式化輸出和輸入
- 2.9.1 字符串常量
- printf函數和putchar函數
- putchar示例(輸出字符,隱藏很深!)
- scanf函數與getchar函數
- scanf示例
- 示例1:用scanf取數字
- 示例2:用scanf取字符(換行符 \n 會被吃掉)(\n 的ascii碼是10)
- getchar函數示例(鍵盤輸入時,貌似比scanf好用)
數據類型
常量與變量
關鍵字
數據類型
數據類型的作用:編譯器預算對象(變量)分配的內存空間大小。
常量
常量:
- 在程序運行過程中,其值不能被改變的量
- 常量一般出現在表達式或賦值語句中
變量 (extern關鍵字)
變量:
- 在程序運行過程中,其值可以改變
- 變量在使用前必須先定義,定義變量前必須有相應的數據類型
標識符命名規則:
- 標識符不能是關鍵字
- 標識符只能由字母、數字、下劃線組成
- 第一個字符必須為字母或下劃線
- 標識符中字母區分大小寫
變量特點:
- 變量在編譯時為其分配相應的內存空間
- 可以通過其名字和地址訪問相應內存
2) 聲明和定義區別
- 聲明變量不需要建立存儲空間,如:extern int a;
- 定義變量需要建立存儲空間,如:int b;
(聲明:表示有這個變量;定義:開辟存儲空間)
從廣義的角度來講聲明中包含著定義,即定義是聲明的一個特例,所以并非所有的聲明都是定義:
- int b 它既是聲明,同時又是定義
- 對于 extern b來講它只是聲明不是定義
示例:extern關鍵字(只聲明不定義,如果賦值就報錯)
使用示例(宏定義(Macro definition):#define )(常量:const關鍵字)
#include <stdio.h> #define MAX 10 //聲明了一個常量,名字叫MAX,值是10,常量的值一旦初始化不可改int main() {int a; //定義了一個變量,其類型為int,名字叫aconst 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語言如何表示相應進制數(八進制以0開頭,十六進制以0x開頭)(以不同進制打印:十進制(%d)、八進制(%o)、十六進制(%x))
十進制 以正常數字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,十六進制是%xprintf("十進制:%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)
反碼運算也不方便,通常用來作為求補碼的中間過渡。
補碼
在計算機系統中,數值一律用補碼來存儲。
補碼特點:
- 對于正數,原碼、反碼、補碼相同
- 對于負數,其補碼為它的反碼加1
- 補碼符號位不動,其他位求反,最后整個數加1,得到原碼
對二進制數來說,先減1后取反和先取反后加1得到的結果是一樣的(對上面代碼的解釋)
-15的原碼: 1000 0000 0000 0000 0000 0000 0000 1111 反碼: 1111 1111 1111 1111 1111 1111 1111 0000 補碼: 1111 1111 1111 1111 1111 1111 1111 0001 補碼的十六進制表示:f f f f f f f 1補碼的意義(對計算機存儲友好:可存儲負數,也能統一 +0 與 -0 的表達)
(為什么計算機打印8進制、十六進制的時候打印的是實際數的補碼?因為如果原數是負數不用補碼不好表示)
示例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的結果
以原碼方式相加:
結果為-15,不正確。
以補碼方式相加:
十進制數 補碼 9 0000 1001 -6 1111 1010
最高位的1溢出,剩余8位二進制表示的是3,正確。
在計算機系統中,數值一律用補碼來存儲,主要原因是:
- 統一了零的編碼
- 將符號位和其它位統一處理
- 將減法運算轉變為加法運算
- 兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被舍棄
C語言原碼、補碼、反碼示例
示例1
示例2
用int和char結果沒啥區別,char占一個字節,int占4個字節(32位64位系統下都是4個字節)
為什么,參考:c語言中,為什么%o、%d、%x輸出的總是32位,如char占一個字節,但輸出卻是32位
示例3(當為8進制或16進制表示時,計算機看到的和輸出的都是補碼)
這是因為計算機看到的十六進制為補碼形式,在打印十進制時,它會把它轉換成原碼打印
但問題是,這里為什么沒有自動擴展為32位呢?
參考:C語言進制轉換時自動擴展位?(原碼、反碼、補碼)(打印%o、%x時會自動擴展到32位【負數先得到其十進制真實數值,再根據其真實數值得到八進制、十進制補碼】)
示例4:自動擴展位?(沒搞懂什么時候會自動擴展什么時候不會。.。。)
sizeof關鍵字(不是函數,只是個運算符)(計算數據類型大小)(有時有坑)
- sizeof不是函數,所以不需要包含任何頭文件,它的功能是計算一個數據類型的大小,單位為字節
- sizeof的返回值為size_t
- size_t類型在32位操作系統下是unsigned int,是一個無符號的整數
注意,上面代碼在64位系統下要用%lu打印才不會警告(不知為什么)
示例1:
#include <stdio.h>int main() {int a;char aa;printf("b = %lu\n", sizeof(a));printf("bb = %lu\n",sizeof(aa));return 0; }
示例2:
結果:
示例3:
結果:
整型:int
整型變量的定義和輸出 (%d、%o、%x、%X、%u)
以下全部為以四字節打印
打印格式 含義 %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進制方式賦值為123int b = 0567; //定義變量b,以8進制方式賦值為0567int c = 0xabc; //定義變量c,以16進制方式賦值為0xabcprintf("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; }結果:
a = 123 8進制:b = 567 10進制:b = 375 16進制:c = abc 16進制:c = ABC 10進制:c = 2748 有符號方式打印:d = -1 無符號方式打印:d = 4294967295
整型變量的輸入(scanf取地址&)
#include <stdio.h>int main() {int a;printf("請輸入a的值:");//不要加“\n”,不然要按回車才出結果scanf("%d", &a);printf("a = %d\n", a); //打印a的值return 0; }如果加了\n,就成這樣了:
short、int、long、long long(短整型 short %hd)
數據類型 占用空間 short(短整型) 2字節 int(整型) 4字節 long(長整形) Windows為4字節,Linux為4字節(32位),8字節(64位) long long(長長整形) 8字節short 也可寫作 short int,long 也可寫作 long int,long long 也可寫作 long long int
為了系統間兼容,通常不使用long int ,直接用long long int
注意:
- 需要注意的是,整型數據在內存中占的字節數與所選擇的操作系統有關。雖然 C 語言標準中沒有明確規定整型數據的長度,但 long 類型整數的長度不能短于 int 類型, short 類型整數的長度不能短于 int 類型。 int 類型整數的長度不能短于short 類型
- 當一個小的數據類型賦值給一個大的數據類型,不會出錯,因為編譯器會自動轉化。但當一個大的類型賦值給一個小的數據類型,那么就可能丟失高位。
結果:
一開始編譯不過,后面改后好了:
有符號數和無符號數區別
1) 有符號數(signed int a = -10; 相當于int a = -10;)
有符號數是最高位為符號位,0代表正數,1代表負數。
解析:
原碼: -1089474374 1100 0000 1111 0000 0000 1111 0100 0110 反碼: 1011 1111 0000 1111 1111 0000 1011 1001 補碼: 1011 1111 0000 1111 1111 0000 1011 1010B F 0 F F 0 B A2) 無符號數(當有符號數的正數來處理)
無符號數最高位不是符號位,而就是數的一部分,無符號數不可能是負數。
當我們寫程序要處理一個不可能出現負值的時候,一般用無符號數,這樣可以增大數的表達最大值。
示例(無符號數按有符號數打印,結果也是有符號數):
#include <stdio.h> #include <stdlib.h> int main() {unsigned int a =0x8000007b;printf("a = %u\n", a);printf("a = %d\n", a);printf("a = %d\n", 0x8000007b);return 0; }結果:
a = 2147483771 a = -2147483525 a = -2147483525分析:printf("a = %d\n", a);是怎么出現這個結果的
首先,因為是打印%d,它會默認按有符號數打印,將0x8000007b看作負數補碼:8 0 0 0 0 0 7 b 1000 0000 0000 0000 0000 0000 0111 1011 反碼: 1000 0000 0000 0000 0000 0000 0111 1010 原碼: 1111 1111 1111 1111 1111 1111 1000 0101 - 7 f f f f f 8 5 -21474835253) 有符號和無符號整型取值范圍
數據類型 占用空間 取值范圍 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)邊緣值示例
像這種 short 的 -32768,int 的 -2147483648,char的 -128之類的,被稱為邊緣值,邊緣值最高位位1,后面全是0(其實是將 -0 的位置給了邊緣值)
計算器怎么秀逗了,怎么顯示補碼?(特么的還真的顯示的是補碼)
(你傻啊,負數當然顯示的是補碼啊,難不成顯示。。。)(但是為什么要擴展到64位?因為你的系統是64位)
原碼:(錯) -2147483648 1 1000 0000 0000 0000 0000 0000 0000 0000 反碼: 1 0111 1111 1111 1111 1111 1111 1111 1111 補碼: 1 1000 0000 0000 0000 0000 0000 0000 0000上面完全是錯的,符號位是指在當前系統下的最高那一位,應該為:
原碼: -2147483648 1000 0000 0000 0000 0000 0000 0000 0000 1000 0000 0000 0000 0000 0000 0000 0000 反碼: 1111 1111 1111 1111 1111 1111 1111 1111 0111 1111 1111 1111 1111 1111 1111 1111 補碼: 1111 1111 1111 1111 1111 1111 1111 1111 1000 0000 0000 0000 0000 0000 0000 0000字符型:char(注意加單引號表示Ascii,其他不加或雙引號跟其他如int、string用法類似)
字符變量的定義和輸出
字符型變量用于存儲一個單一字符,在 C 語言中用 char 表示,其中每個字符變量都會占用 1 個字節。在給字符型變量賦值時,需要用一對英文半角格式的單引號(' ')把字符括起來。
字符變量實際上并不是把該字符本身放到變量的內存單元中去,而是將該字符對應的 ASCII 編碼放到變量的存儲單元中。char的本質就是一個1字節大小的整型。
#include <stdio.h>int main() {char ch = 'a';printf("sizeof(ch) = %lu\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); //97printf("A = %d\n", A); //65printf("A = %c\n", 'a' - 32); //小寫a轉大寫Aprintf("a = %c\n", 'A' + 32); //大寫A轉小寫ach = ' ';printf("空字符:%d\n", ch); //空字符ASCII的值為32printf("A = %c\n", 'a' - ' '); //小寫a轉大寫Aprintf("a = %c\n", 'A' + ' '); //大寫A轉小寫areturn 0; }結果:
sizeof(ch) = 1 ch[%c] = a ch[%d] = 97 a = 97 A = 65 A = A a = a 空字符:32 A = A a = a分析:
1、把‘x’看作一個字節的整型數字
2、小寫字母比大寫字母多32(空格‘ ’)
字符變量的輸入 scanf
#include <stdio.h>int main() {char ch;printf("請輸入ch的值:");//不要加“\n”scanf("%c", &ch);printf("ch = %c\n", ch); //打印ch的字符printf("ch_ascii = %d\n", ch);//打印ch的Ascii碼return 0; }ASCII對照表(略,自己上網查)
ASCII 碼大致由以下兩部分組成:
- ASCII 非打印控制字符: ASCII 表上的數字 0-31 分配給了控制字符,用于控制像打印機等一些外圍設備。
- ASCII 打印字符:數字 32-126 分配給了能在鍵盤上找到的字符,當查看或打印文檔時就會出現。數字 127 代表 Del 命令。
轉義字符 \n \r \b等 (’\123’為8進制轉義字符,’\x23’為16進制轉義字符)
注意:紅色字體標注的為不可打印字符。
退格鍵\b相當于刪除一個字符
#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進制數為83printf("%d\n", '\x23');// '\x23'為16進制轉義字符,0x23對應10進制數為35return 0; }結果:
efg abefg 83 35數值溢出
當超過一個數據類型能夠存放最大的范圍時,數值會溢出。
有符號位最高位溢出的區別:符號位溢出會導致數的正負發生改變,但最高位的溢出會導致最高位丟失。
數據類型 占用空間 取值范圍 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+2printf("%d\n", ch);// 0111 1111//+2后 1000 0001,這是負數補碼,其原碼為 1111 1111,結果為-127//最高位的溢出會導致最高位丟失unsigned char ch2;ch2 = 0xff+1; //255+1printf("%u\n", ch2);// 1111 1111//+1后 10000 0000, char只有8位最高位的溢出,結果為0000 0000,十進制為0ch2 = 0xff + 2; //255+1printf("%u\n", ch2);// 1111 1111//+1后 10000 0001, char只有8位最高位的溢出,結果為0000 0001,十進制為1return 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.14Fdouble b = 3.14;printf("a = %f\n", a);printf("b = %lf\n", b);//科學法賦值a = 3.2e3f; //3.2*1000 = 32000,e可以寫Eprintf("a1 = %f\n", a);a = 100e-3f; //100*0.001 = 0.1printf("a2 = %f\n", a);a = 3.1415926f;printf("a3 = %f\n", a); //結果為3.141593return 0; }類型限定符 extern const volatile register
限定符 含義 extern 聲明一個變量,extern聲明的變量沒有建立存儲空間。 extern int a; const 定義一個常量,常量的值不能修改。 const int a = 10; volatile 防止編譯器優化代碼 register 定義寄存器變量,提高效率。register是建議型的指令,而不是命令型的指令,如果CPU有空閑寄存器,那么register就生效,如果沒有空閑寄存器,那么register無效。(現在有些cpu能自動優化的,那個這個就多此一舉了,但是還是需要了解)volatile 是在對變量連續賦值的時候,防止編譯器不經過中間值而一步到位,這對設計如跑馬燈之類的程序是不利的,所以需要防止編譯器自動優化
字符串格式化輸出和輸入
2.9.1 字符串常量
- 字符串是內存中一段連續的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 字符型??梢园演斎氲臄底职凑誂SCII碼相應轉換為對應的字符 %s char * 字符串。輸出字符串中的字符直至字符串中的空字符(字符串以'\0‘結尾,這個'\0'即空字符) %p void * 以16進制形式輸出指針 %% % 輸出一個百分號注意:%o 和 %x 說的無符號指的是指沒有+ -號,它的數值還是可以表示正負的
參考:C語言,為什么%o和%x輸出的都是無符號數,為什呢不能有負數
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只有一個參數,就是要輸出的charlong 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);printf("d = \' %-5.3lf \'\n", d);return 0; }結果:
dontla@dontla-virtual-machine:~/桌面/c_code/day03$ gcc test06.c test06.c: In function ‘main’: test06.c:21:9: warning: '0' flag ignored with '-' flag in gnu_printf format [-Wformat=]21 | printf("abc = '%-06d'\n", abc);| ^~~~~~~~~~~~~~~~~ dontla@dontla-virtual-machine:~/桌面/c_code/day03$ ./a.out a = 100 0x7ffc7eae3368 %d a100, 64, 144 1000, 3e8, 1750 abc = ' 10' abc = '10 ' abc = '000010' abc = '10 ' d = ' 12.300 ' d = ' 12.300 ' //上面兩個什么操作看不懂呢???(Dontla:m.n右邊數字n的優先級高于左邊,當發生沖突時,優先保證n不保證m【注意,對于m來說,小數點也占一位】) //m.n(代表一個整數) m指域寬,即對應的輸出項在輸出設備上所占的字符數。n指精度,用于說明輸出的實型數的小數位數。對數值型的來說,未指定n時,隱含的精度為n=6位。?0不能和 - 同時使用,因為 - 代表左對齊,如果沒有小數點的話,后面補零,數值就不對了。
示例:
putchar示例(輸出字符,隱藏很深!)
示例1:
#include <stdio.h> #include <stdlib.h> int main() {char c = 'a';printf("%d\n", putchar(c)); \\a97printf("%d\n", c); \\97putchar(c);printf("%d\n", 1111111); \\a1111111return 0; }示例2:
#include <stdio.h> int main() {putchar('a');return 0; }scanf函數與getchar函數
- getchar是從標準輸入設備讀取一個char。
- scanf通過%轉義的方式可以得到用戶通過標準輸入設備輸入的數據。
scanf示例
示例1:用scanf取數字
#include <stdio.h> int main() { int a;int b;printf("請輸入字符a:\n");scanf("%d", &a);printf("請輸入字符b:\n");scanf("%d", &b);printf("%d %d\n", a, b);return 0; }結果:
請輸入字符a: 5 請輸入字符b: 6 5 6示例2:用scanf取字符(換行符 \n 會被吃掉)(\n 的ascii碼是10)
#include <stdio.h> int main() { char a;char b;printf("請輸入字符a:\n");scanf("%c", &a);printf("請輸入字符b:\n");scanf("%c", &b);printf("%c %c\n", a, b);printf("%d %d\n", a, b);return 0; }結果:
請輸入字符a: h 請輸入字符b: h 104 10getchar函數示例(鍵盤輸入時,貌似比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; }結果:
請輸入ch1的字符:a ch1 = a 請輸入ch2的字符:b 'ch2 = btest' 請輸入ch3的字符:c ch3 = c 請輸入a的值:6 a = 6 請輸入b的值:8 b = 8https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver
總結
以上是生活随笔為你收集整理的黑马程序员C语言基础(第四天)数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: visual studio快捷键 Qt
- 下一篇: qt creator创建cmake构建的