1. 程式人生 > 其它 >怎樣學習C語言——快速上手C語言系列之—認識C語言

怎樣學習C語言——快速上手C語言系列之—認識C語言

技術標籤:111c語言git補碼程式語言編譯器

目錄

一,C語言概述

1.1 什麼是C語言

1.2 計算機介紹

1.3 語言發展歷程

1.4 為什麼要學習C語言

1.5 第一個C語言程式:

二,資料型別

2.1 常量與變數

2.2 進位制

2.3 計算機記憶體數值儲存方式

2.4 sizeof關鍵字

2.5整型:int

2.6字元型:char

2.9字串格式化輸出和輸入

三,運算子與表示式

3.1 常用運算子分類

3.2 算術運算子

3.3 賦值運算子

3.4 比較運算子

3.5 邏輯運算子

3.6 運算子優先順序

3.7 型別轉換


一,C語言概述

1.1 什麼是C語言

一提到語言這個詞語,自然會想到的是像英語、漢語等這樣的自然語言,因為它是人和人交換資訊不可缺少的工具。

而今天計算機遍佈了我們生活的每一個角落,除了人和人的相互交流之外,我們必須和計算機角落。

用什麼的什麼樣的方式和計算機做最直接的交流呢?人們自然想到的是最古老也最方便的方式——語言,而C語言就是人和計算機交流的一種語言。

語言是用來交流溝通的。有一方說,有另一方聽,必須有兩方參與,這是語言最重要的功能:

 說的一方傳遞資訊,聽的一方接收資訊;
 說的一方下達指令,聽的一方遵循命令做事情。

語言是人和人交流,C語言是人和機器交流。只是,人可以不聽另外一個人,但是,計算機是無條件服從。

語言有獨特的語法規則和定義,雙方必須遵循這些規則和定義才能實現真正的交流。

喜歡的可以加QQ一塊學習:2621873689

1.2 計算機介紹

1.2.1 計算機結構組成

1.2.2 計算機系統組成

1.2.3 程式和指令

 指令是對計算機進行程式控制的最小單位。
 所有的指令的集合稱為計算機的指令系統。
 程式是為完成一項特定任務而用某種語言編寫的一組指令序列。

1.3 語言發展歷程

1.3.1 機器語言

計算機的大腦或者說心臟就是CPU,它控制著整個計算機的運作。每種CPU,都有自己的指令系統。這個指令系統,就是該CPU的機器語言。

機器語言是一組由0和1系列組成的指令碼,這些指令碼,是CPU製作廠商規定出來的,然後釋出出來,請程式設計師遵守。

要讓計算機幹活,就得用機器語言(二級制數)去命令它。這樣的命令,不是一條兩條,而是上百條。而且不同型號的計算機其機器語言是不相通的,按著一種計算機的機器指令編制的程式,不能在另一種計算機上執行。

1.3.2 組合語言和編譯器

機器語言程式設計是不是很令人煩惱呢,終於出現了組合語言,就是一些識別符號取代0與1。一門人類可以比較輕鬆認識的程式語言。

只是這門語言計算機並不認識,所以人類還不能用這門語言命令計算機做事情。這正如如何才能讓中國人說的話美國人明白呢?——翻譯!

所以,有一類專門的程式,既認識機器語言,又認識組合語言,也就是編譯器,將識別符號換成0與1,知道怎麼把組合語言翻譯成機器語言。

1.3.3 高階語言

組合語言和機器語言都是面向機器的,機器不同,語言也不同。既然有辦法讓組合語言翻譯成機器語言,難道就不能把其他更人性化的語言翻譯成機器語言?

1954年,Fortran語言出現了,其後相繼出現了其他的類似語言。這批語言,使程式設計師擺脫了計算機硬體的限制,把主要精力放在了程式設計上,不在關注低層的計算機硬體。這類語言,稱為高階語言。

同樣的,高階語言要被計算機執行,也需要一個翻譯程式將其翻譯成機器語言,這就是編譯程式,簡稱編譯器。
這類高階語言解決問題的方法是分析出解決問題所需要的步驟,把程式看作是資料被加工的過程。基於這類方法的程式設計語言成為面向過程的語言。C語言就是這種面向過程的程式設計語言。

1.3.4 語言的層次

1.3.5 語言進化史

1.4 為什麼要學習C語言

1.4.1 C語言特點

優點:

 程式碼量小
 執行速度快
 功能強大
 程式設計自由

缺點:

 寫程式碼實現週期長
 可移植性較差
 過於自由,經驗不足易出錯
 對平臺庫依賴較多

1.4.2 學習C語言理由

1.4.3 C語言應用領域

C語言的應用極其廣泛,從網站後臺,到底層作業系統,從多媒體應用到大型網路遊戲,均可使用C語言來開發:

  •  C語言可以寫網站後臺程式
  •  C語言可以專門針對某個主題寫出功能強大的程式庫
  •  C語言可以寫出大型遊戲的引擎
  •  C語言可以寫出另一個語言來
  •  C語言可以寫作業系統和驅動程式,並且只能用C語言編寫
  •  任何裝置只要配置了微處理器,就都支援C語言。從微波爐到手機,都是由C語言技術來推動的

1.4.4 C語言的簡潔

C語言僅有32個關鍵字,9種控制語句,34種運算子,卻能完成無數的功能:

1.4.5 學習C語言的常見困惑

1.5 第一個C語言程式:

HelloWorld

1.5.1 編寫C語言程式碼:

hello.c

#include <stdio.h>
int main()
{
//這是第一個C語言程式碼
printf(“hello world\n”);
return 0;
}


C語言的原始碼檔案是一個普通的文字檔案,但副檔名必須是.c。

1.5.2 通過gcc編譯C程式碼

  1. gcc編譯器介紹
    編輯器(如vi、記事本)是指我用它來寫程式的(編輯程式碼),而我們寫的程式碼語句,電腦是不懂的,我們需要把它轉成電腦能懂的語句,編譯器就是這樣的轉化工具。就是說,我們用編輯器編寫程式,由編譯器編譯後才可以執行!
    編譯器是將易於編寫、閱讀和維護的高階計算機語言翻譯為計算機能解讀、執行的低階機器語言的程式。
    gcc(GNU Compiler Collection,GNU 編譯器套件),是由 GNU 開發的程式語言編譯器。gcc原本作為GNU作業系統的官方編譯器,現已被大多數類Unix作業系統(如Linux、BSD、Mac OS X等)採納為標準的編譯器,gcc同樣適用於微軟的Windows。
  2. gcc最初用於編譯C語言,隨著專案的發展gcc已經成為了能夠編譯C、C++、Java、Ada、fortran、Object C、Object C++、Go語言的編譯器大家族。

編譯命令格式:
gcc [-option1] …
g++ [-option1] …
 命令、選項和原始檔之間使用空格分隔
 一行命令中可以有零個、一個或多個選項
 檔名可以包含檔案的絕對路徑,也可以使用相對路徑
 如果命令中不包含輸出可執行檔案的檔名,可執行檔案的檔名會自動生成一個預設名,Linux平臺為a.out,Windows平臺為a.exe

gcc、g++編譯常用選項說明:
選項 含義
-o file 指定生成的輸出檔名為file
-E 只進行預處理
-S(大寫) 只進行預處理和編譯
-c(小寫) 只進行預處理、編譯和彙編

gma warning(disable:4996) //或者使用這個

二,資料型別

2.1 常量與變數

2.1.1 關鍵字

2.1.2 資料型別

資料型別的作用:

編譯器預算物件(變數)分配的記憶體空間大小。

2.1.3 常量

常量:

 在程式執行過程中,其值不能被改變的量
 常量一般出現在表示式或賦值語句中

整型常量 100,200,-100,0
實型常量 3.14 , 0.125,-3.123
字元型常量 ‘a’,‘b’,‘1’,‘\n’
字串常量 “a”,“ab”,“12356”

2.1.4 變數

變數:

 在程式執行過程中,其值可以改變
 變數在使用前必須先定義,定義變數前必須有相應的資料型別

識別符號命名規則:

 識別符號不能是關鍵字
 識別符號只能由字母、數字、下劃線組成
 第一個字元必須為字母或下劃線
 識別符號中字母區分大小寫

變數特點:

 變數在編譯時為其分配相應的記憶體空間
 可以通過其名字和地址訪問相應記憶體

宣告和定義區別:

 宣告變數不需要建立儲存空間,如: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來講它只是宣告不是定義

一般的情況下,把建立儲存空間的宣告稱之為“定義”,而把不需要建立儲存空間的宣告稱之為“宣告”。

2.1.5 使用示例

#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;

}

2.2 進位制

進位制也就是進位制,是人們規定的一種進位方法。 對於任何一種進位制—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

2.2.1 二進位制

二進位制是計算技術中廣泛採用的一種數制。二進位制資料是用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,每次相乘都是小數部分,順序看取整後的數就是轉化後的結果。

2.2.2 八進位制

八進位制,Octal,縮寫OCT或O,一種以8為基數的計數法,採用0,1,2,3,4,5,6,7八個數字,逢八進1。一些程式語言中常常以數字0開始表明該數字是八進位制。

八進位制的數和二進位制數可以按位對應(八進位制一位對應二進位制三位),因此常應用在計算機語言中。

十進位制轉化八進位制的方法:
用十進位制數除以8,分別取餘數和商數,商數為0的時候,將餘數倒著數就是轉化後的結果。

2.2.3 十六進位制

十六進位制(英文名稱:Hexadecimal),同我們日常生活中的表示法不一樣,它由0-9,A-F組成,字母不區分大小寫。與10進位制的對應關係是:0-9對應0-9,A-F對應10-15。

十六進位制的數和二進位制數可以按位對應(十六進位制一位對應二進位制四位),因此常應用在計算機語言中。

十進位制轉化十六進位制的方法:
用十進位制數除以16,分別取餘數和商數,商數為0的時候,將餘數倒著數就是轉化後的結果。

2.2.4 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;

}

2.3 計算機記憶體數值儲存方式

2.3.1 原碼

一個數的原碼(原始的二進位制碼)有如下特點:

 最高位做為符號位,0表示正,為1表示負
 其它數值部分就是數值本身絕對值的二進位制數
 負數的原碼是在其絕對值的基礎上,最高位變為1

下面數值以1位元組的大小描述:
十進位制數 原碼
+15 0000 1111
-15 1000 1111
+0 0000 0000
-0 1000 0000

原碼錶示法簡單易懂,與帶符號數本身轉換方便,只要符號還原即可,但當兩個正數相減或不同符號數相加時,必須比較兩個數哪個絕對值大,才能決定誰減誰,才能確定結果是正還是負,所以原碼不便於加減運算。

2.3.2 反碼

 對於正數,反碼與原碼相同
 對於負數,符號位不變,其它部分取反(1變0,0變1)

十進位制數 反碼
+15 0000 1111
-15 1111 0000
+0 0000 0000
-0 1111 1111

反碼運算也不方便,通常用來作為求補碼的中間過渡。

2.3.3 補碼

在計算機系統中,數值一律用補碼來儲存。

補碼特點:
 對於正數,原碼、反碼、補碼相同
 對於負數,其補碼為它的反碼加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;

}

2.3.4 補碼的意義

示例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,正確。

在計算機系統中,數值一律用補碼來儲存,主要原因是:
 統一了零的編碼
 將符號位和其它位統一處理
 將減法運算轉變為加法運算
 兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄

2.4 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;

}

2.5整型:int

2.5.1 整型變數的定義和輸出
列印格式 含義
%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;

}
2.5.2 整型變數的輸入
#include <stdio.h>

int main()
{
int a;
printf(“請輸入a的值:”);

//不要加“\n”
scanf("%d", &a);

printf("a = %d\n", a); //列印a的值

return 0;

}

2.5.3 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;

}

2.5.4 有符號數和無符號數區別

有符號數
有符號數是最高位為符號位,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)

2.6字元型:char

2.6.1 字元變數的定義和輸出
字元型變數用於儲存一個單一字元,在 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;

}

2.6.2 字元變數的輸入
#include <stdio.h>

int main()
{
char ch;
printf(“請輸入ch的值:”);

//不要加“\n”
scanf("%c", &ch);
printf("ch = %c\n", ch); //列印ch的字元

return 0;

}

2.6.2 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 命令。

2.6.3 轉義字元
轉義字元 含義 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;

}

2.6.4 數值溢位

當超過一個數據型別能夠存放最大的範圍時,數值會溢位。

有符號位最高位溢位的區別:符號位溢位會導致數的正負發生改變,但最高位的溢位會導致最高位丟失。

資料型別 佔用空間 取值範圍
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;

}

2.7實型(浮點型):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;

}

2.8型別限定符
限定符 含義
extern 宣告一個變數,extern宣告的變數沒有建立儲存空間。
extern int a;
const 定義一個常量,常量的值不能修改。
const int a = 10;
volatile 防止編譯器優化程式碼
register 定義暫存器變數,提高效率。register是建議型的指令,而不是命令型的指令,如果CPU有空閒暫存器,那麼register就生效,如果沒有空閒暫存器,那麼register無效。

2.9字串格式化輸出和輸入

2.9.1 字串常量

 字串是記憶體中一段連續的char空間,以’\0’(數字0)結尾。
 字串常量是由雙引號括起來的字元序列,如“china”、“C program”,“$12.5”等都是合法的字串常量。

字串常量與字元常量的不同:

每個字串的結尾,編譯器會自動的新增一個結束標誌位’\0’,即 “a” 包含兩個字元’a’和’\0’。

2.9.2 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’即空字元)
%p void * 以16進位制形式輸出指標
%% % 輸出一個百分號

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;

}

2.9.3 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;

}

三,運算子與表示式

3.1 常用運算子分類

運算子型別 作用
算術運算子 用於處理四則運算
賦值運算子 用於將表示式的值賦給變數
比較運算子 用於表示式的比較,並返回一個真值或假值
邏輯運算子 用於根據表示式的值返回真值或假值
位運算子 用於處理資料的位運算
sizeof運算子 用於求位元組數長度

3.2 算術運算子

運算子 術語 示例 結果

  1. 正號 +3 3
  2. 負號 -3 -3
  3. 加 10 + 5 15
  4. 減 10 - 5 5
  5. 乘 10 * 5 50
    / 除 10 / 5 2
    % 取模(取餘) 10 % 3 1
    ++ 前自增 a=2; b=++a; a=3; b=3;
    ++ 後自增 a=2; b=a++; a=3; b=2;
    – 前自減 a=2; b=–a; a=1; b=1;
    – 後自減 a=2; b=a–; a=1; b=2;

3.3 賦值運算子

運算子 術語 示例 結果
= 賦值 a=2; b=3; a=2; b=3;
+= 加等於 a=0; a+=2; a=2;
-= 減等於 a=5; a-=3; a=2;
= 乘等於 a=2; a=2; a=4;
/= 除等於 a=4; a/=2; a=2;
%= 模等於 a=3; a%2; a=1;

3.4 比較運算子

C 語言的比較運算中, “真”用數字“1”來表示, “假”用數字“0”來表示。
運算子 術語 示例 結果
== 相等於 4 == 3 0
!= 不等於 4 != 3 1
< 小於 4 < 3 0

大於 4 > 3 1
<= 小於等於 4 <= 3 0
= 大於等於 4 >= 1 1

3.5 邏輯運算子

運算子 術語 示例 結果
! 非 !a 如果a為假,則!a為真;
如果a為真,則!a為假。
&& 與 a && b 如果a和b都為真,則結果為真,否則為假。
|| 或 a || b 如果a和b有一個為真,則結果為真,二者都為假時,結果為假。

3.6 運算子優先順序

優先順序 運算子 名稱或含義 使用形式 結合方向 說明
1 [] 陣列下標 陣列名[常量表達式] 左到右 –
() 圓括號 (表示式)/函式名(形參表) –
. 成員選擇(物件) 物件.成員名 –
-> 成員選擇(指標) 物件指標->成員名 –

2 - 負號運算子 -表示式 右到左 單目運算子

按位取反運算子 ~表示式
++ 自增運算子 ++變數名/變數名++
– 自減運算子 --變數名/變數名–

*	取值運算子	*指標變數		
&	取地址運算子	&變數名		
!	邏輯非運算子	!表示式		
(型別)	強制型別轉換	(資料型別)表示式		--
sizeof	長度運算子	sizeof(表示式)		--

3 / 除 表示式/表示式 左到右 雙目運算子
* 乘 表示式*表示式
% 餘數(取模) 整型表示式%整型表示式
4 + 加 表示式+表示式 左到右 雙目運算子
- 減 表示式-表示式
5 << 左移 變數<<表示式 左到右 雙目運算子
>> 右移 變數>>表示式

6 > 大於 表示式>表示式 左到右 雙目運算子
>= 大於等於 表示式>=表示式
< 小於 表示式<表示式
<= 小於等於 表示式<=表示式
7 == 等於 表示式==表示式 左到右 雙目運算子
!= 不等於 表示式!= 表示式

8 & 按位與 表示式&表示式 左到右 雙目運算子
9 ^ 按位異或 表示式^表示式 左到右 雙目運算子
10 | 按位或 表示式|表示式 左到右 雙目運算子
11 && 邏輯與 表示式&&表示式 左到右 雙目運算子
12 || 邏輯或 表示式||表示式 左到右 雙目運算子

13 ?: 條件運算子 表示式1?
表示式2: 表示式3 右到左 三目運算子

14 = 賦值運算子 變數=表示式 右到左 –
/= 除後賦值 變數/=表示式 –
= 乘後賦值 變數=表示式 –
%= 取模後賦值 變數%=表示式 –
+= 加後賦值 變數+=表示式 –
-= 減後賦值 變數-=表示式 –
<<= 左移後賦值 變數<<=表示式 –
>>= 右移後賦值 變數>>=表示式 –
&= 按位與後賦值 變數&=表示式 –
^= 按位異或後賦值 變數^=表示式 –
|= 按位或後賦值 變數|=表示式 –

15 , 逗號運算子 表示式,表示式,… 左到右 –

3.7 型別轉換

資料有不同的型別,不同型別資料之間進行混合運算時必然涉及到型別的轉換問題。

轉換的方法有兩種:
 自動轉換(隱式轉換):遵循一定的規則,由編譯系統自動完成。
 強制型別轉換:把表示式的運算結果強制轉換成所需的資料型別。

型別轉換的原則:佔用記憶體位元組數少(值域小)的型別,向佔用記憶體位元組數多(值域大)的型別轉換,以保證精度不降低。

3.7.1 隱式轉換

#include <stdio.h>

int main()
{
int num = 5;
printf(“s1=%d\n”, num / 2);
printf(“s2=%lf\n”, num / 2.0);

return 0;

}


3.7.2 強制轉換
強制型別轉換指的是使用強制型別轉換運算子,將一個變數或表示式轉化成所需的型別,其基本語法格式如下所示:
(型別說明符) (表示式)

#include <stdio.h>

int main()
{
float x = 0;
int i = 0;
x = 3.6f;

i = x;            //x為實型, i為整型,直接賦值會有警告
i = (int)x;        //使用強制型別轉換

printf("x=%f, i=%d\n", x, i);

return 0;

}

喜歡的可以加QQ:2621873689

喜歡的點個贊,加個關注喲。