目錄
一、簡單了解C語言和程序設計
了解什麽是計算機程序和計算機語言計算機程序
程序就是一組計算機能識別和執行的指令,每一條指令使計算機執行特定的操作。一個(ge) 特定的指令序列用來完成一定的功能。為(wei) 了使計算機能實現各種功能,往往需要成百上千萬(wan) 個(ge) 程序。
總之,計算機的一切操作都是由程序控製的,離開程序,計算機將毫無用處。所以,計算機的本質就是程序的機器,程序和指令是計算機係統中最基本的概念。
計算機語言
計算機語言即計算機能識別的語言,粗俗點說,就是計算機能看懂的。
計算機語言經曆了以下幾個(ge) 發展階段:
機器語言 計算機工作基於(yu) 二進製,從(cong) 根本上說,計算機隻能識別和接受由0和1組成的指令。計算機發展初期,一般計算機的指令長度為(wei) 16,即16個(ge) 二進製數(0或1)組成的一條指令,如:0010111110101101
這種能直接識別和接受的二進製代碼稱為(wei) 機器指令 ,而機器指令的集合就是機器語言。
缺點:難學,難用,難以推廣使用
符號語言 為(wei) 克服上述缺點而創造出來的,它是用一些英文字母和數字來表示一個(ge) 指令。如:
ADD A,B(執行A+B=>A,將寄存器A中的數與(yu) 寄存器B中的數相加,放到寄存器A中)
很明顯,這並不能讓計算機識別並執行,所以還需要一種匯編程序的軟件將符號語言的指令轉換為(wei) 機器指令。這種轉換的過程又叫做 “匯編” 或 “代真” ,故,符號語言又稱符號匯編語言或匯編語言。
以上兩(liang) 種語言均為(wei) 計算機低級語言。
高級語言 為(wei) 克服低級語言的缺點而創造出來,更加利於(yu) 人們(men) 理解。如要計算和輸出3×6÷5,隻需寫(xie) :a=(3*6)/5;printf(“%d”,a);
計算機語言就簡單介紹到這裏,如需深度了解可上百度等各大瀏覽器查詢。
C語言的特點(1)語言簡潔,使用方便。
(2)運算符豐(feng) 富。
(3)數據類型豐(feng) 富。
(4)具有結構化的控製語句(while語句,do…while語句,if…else語句,switch語句,for語句)。
(5)語法限製不太嚴(yan) 格。
(6)C語言允許直接訪問物理地址,能進行位(bit)操作,能實現匯編語言的大部分功能,可以直接對硬件進行操作。
(7)用C語言編寫(xie) 的程序可移植性好。
(8)生成目標代碼質量高,程序執行效率高。
二、初識C語言程序
簡單示例【例1.1】輸出下麵一行代碼。
Hello World!
#include<stdio.h> //這是編譯預處理的一個(ge) 指令 int main() //定義(yi) 一個(ge) 主函數 { //函數開始的標誌 printf("Hello World!\n"); //printf是輸出指令,即此時輸出Hello World! return 0; //函數結束時返回函數值0,寫(xie) return 1;也行,隻是返回值為(wei) 1 } //函數結束的標誌
運行結果:
Hello World!
在使用函數庫中輸入輸出函數時,編譯係統要求程序提供有關(guan) 此函數的信息(例如對輸入輸出函數的聲明和宏的定義(yi) ,全局量的定義(yi) 等),而我們(men) 的程序中的 “ #include<stdio.h> ” 的作用就是用來提供這些信息的。stdio.h 就是一個(ge) 係統所提供的文件名
int表示該函數類型是一個(ge) 整型的數據類型;
main是該函數的名字;
" return 0 ; "的作用是:當main函數執行結束前將整數0作為(wei) 函數值,返回到調用函數處。
“ \n ” 是換行符。
注釋
“ // ” 代表注釋,在編譯時注釋的部分是不會(hui) 產(chan) 生目標代碼,注釋對運行不起作用,隻是給人看的,而不是計算機執行的。
C語言允許注釋的方法有兩(liang) 種:
① 以 // 開始的單行注釋,以 // 開始,換行(Enter)時結束。隻會(hui) 注釋掉 // 之後的所有的解釋性語句(這裏係統自動換行不算哦,因為(wei) 你這段話在這一行放不下了),但是若為(wei) 追求美觀,可以換一行繼續使用 // 進行注釋
② / * (這裏注釋) * /,“ / * * / ”是多行注釋,就是即使 使用了換行符(Enter)也會(hui) 被注釋掉,以 /* 開始,以 */ 結束。可單行使用,也可多行使用。
注釋內(nei) 又注釋,這會(hui) 導致注釋可能會(hui) 出錯。
#include<stdio.h> //這是編譯預處理的一個(ge) 指令 /* int main() { printf("Hello World!\n"); return 0; } */
看看顏色是不是變了?這就說明這一段語句全部被注釋掉了。
★特別注意 ! ! !
以上所有代碼(包括英文、字符和標點符號)全部要用英文來寫(xie) ! ! !
好,如果你看懂了上麵的代碼,那我們(men) 繼續下一道。
【例1. 2】求兩(liang) 個(ge) 整數之和
解題思路:首先設置三個(ge) 變量a, b, sum(變量可隨便用任何字母或單詞來表示),sum在這裏我們(men) 代表兩(liang) 整數之和。用賦值運算符 “ = ” 將a,b相加後的和賦給sum。
#include<stdio.h> //這是編譯預處理的一個(ge) 指令 int main() //定義(yi) 一個(ge) 主函數 { //函數開始的標誌 int a,b,sum; //變量聲明,定義(yi) a,b,sum為(wei) 整型變量 a = 12; //對變量a進行賦值 b = 5; //對變量b進行賦值 sum = a + b; //進行 a+b 運算,並把結果存放在sum中 printf("%d",sum); //printf是輸出指令,sum的值輸出 return 0; //函數結束時返回函數值0,寫(xie) return 1; 也行,隻是返回值為(wei) 1 } //函數結束的標誌
運行結果:
17
本人個(ge) 人認為(wei) 此處在注釋中已經講得很明白了,int這個(ge) 整型的數據類型,在後麵還會(hui) 細講。
【變式1】輸入a, b兩(liang) 個(ge) 整數,求兩(liang) 整數之和。
#include<stdio.h> int main() { int a,b,sum; scanf("%d %d",&a,&b); //scanf是輸入指令,輸入 a 和 b 的值 sum = a + b; printf("sum = %d",sum);//輸出sum的值 return 0; }
這個(ge) printf函數圓括號內(nei) 有兩(liang) 個(ge) 參數。
第一個(ge) 參數是引號內(nei) 的sum = %d\n,它是輸出格式字符串,作用是輸出用戶希望輸出的字符和輸出的格式。其中sum = 是用戶希望輸出的字符,%d是指定的輸出格式,d表示用 “ 十進製整數 ” 形式輸出。
第二個(ge) 參數sum表示要輸出變量sum的值。
在執行printf函數時,將sum變量的值(以十進製整數表示)取代引號中的 %d 。如下圖:
(圖源《C程序設計(第五版)》譚浩強 著)
這裏就仔細講解一下printf函數和scanf函數。
printf()函數
printf()函數是式樣化輸出函數,一般用於(yu) 向準則輸出設備按規定式樣輸出消息。printf()函數的調用格式為(wei) :printf(“<式樣化字符串>”,<參數表>);
注意,要用英文字符輸入語句。
其中式樣化字符串包括兩(liang) 部分內(nei) 容:
一部分是正常字符,這些字符將按原樣輸出;另一部分是式樣化規定字符,以 “ % ” 開端,後跟一個(ge) 或幾個(ge) 規定字符,用來確定輸出內(nei) 容式樣。參量表是需求輸出的一係列參數,其個(ge) 數務必於(yu) 式樣化字符串所闡明的輸出參數個(ge) 數一樣多,各參數之間用英文逗號“ , ” 分開,且順序逐一對應,不然會(hui) 出現意想不到的錯誤。
函數原型:
int printf(const char * format, …);
函數值返回值為(wei) 整型。若成功則返回輸出的字符數,輸出出錯則返回負值。
scanf()函數
scanf() 是輸入函數,就是我們(men) 從(cong) 鍵盤中輸入我們(men) 想要測試的數據。與(yu) printf() 函數一樣都被聲明在頭文件 stdio.h 裏,因此在使用 scanf() 函數時要加上 #include <stdio.h> 。(在有一些實現中,printf() 和 scanf() 函數在使用時可以不使用預編譯命令 #include 。)
函數原型:
int scanf (const char * restrict format , …);
(稍作了解即可)
返回值
scanf() 函數返回成功讀入的數據項數,讀入數據時遇到了 “ 文件結束 ” 則返回EOF。
如:
scanf (“%d %d”,&a,&b);
函數返回值為(wei) int 型。如果 a 和 b 都被成功讀入,那麽(me) scanf 的返回值就是2;如果隻有a 被讀入,返回值為(wei) 1(b 同樣);如果a 讀取失敗,返回值為(wei) 0(b 同樣);如果遇到錯誤或遇到enf of file, 返回值為(wei) EOF。
&a,&b中的 & 是尋址操作符,&a表示對象a 在內(nei) 存中的地址,是一個(ge) 右值。變量a , b的地址是在編譯階段分配的(存儲(chu) 順序由編譯器決(jue) 定)。
注意!!!
如果 scanf 中 %d 是連著寫(xie) 的,如 “%d%d%d”,在輸入數據時,數據之間不可以用逗號分隔,隻能用空白字符(空格或Tab 鍵或者回車鍵)分隔——“2(空格)3(Tab)4”或“2(Tab)3(回車)4”等。若是“%d,%d,%d”,則在輸入數據時必須加 “ , ” ,如:“2,3,4”。
【變式2】找兩(liang) 個(ge) 整數中的較大者。
第一種方式:
#include<stdio.h> int main() { int a,b,max; scanf("%d,%d",&a,&b); //輸入數據 a, b if(a >= b) //如果 a >= b,則將 a賦值給 max max = a; else //否則,將 b賦值給 max max = b; printf("%d",max); //輸出 max return 0; }
第二種方式:(使用函數)
#include<stdio.h> int main() { int max(int x,int y); //定義(yi) 函數 int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); //調用 max函數,將值賦給 c printf("max = %d\n",c); return 0; } //求兩(liang) 個(ge) 整數中的較大者的 max函數 int max(int x,int y)//定義(yi) max函數函數值為(wei) 整型,x、y均為(wei) 形式參數 { int z; if(x>y) z=x; else z=y; return z; //將 z的值作為(wei) max函數值,返回到調用函數的位置 }
運行結果:
8 ,5
max = 8
字符輸入輸出函數
除了使用 printf()、scanf()輸出和輸入字符外,C語言標準函數庫還有一些專(zhuan) 門用於(yu) 字符輸入輸出的函數。
字符輸出函數putchar()
putchar()函數的一般形式為(wei) :
putchar( c );
函數的功能是輸出一個(ge) 字符,並返回輸出字符的ASCII碼值。
“ putchar( c ); ”中c可以是字符常量、字符型變量或整型變量,即將一個(ge) 整型數據作為(wei) ASCII碼,輸出相應的字符。
【例1. 2】putchar() 函數的使用
#include<stdio.h> int main() { int i = 97; char ch = 'a'; //聲明並初始化 putchar(i); //輸出字符 a putchar('\n'); //換行,可以輸出控製字符,起控製作用 putchar(ch); //輸出字符變量 ch的值 'a' return 0; }
運行結果:
a
a
字符輸入函數getchar()
getchar()函數的一般形式為(wei) :
getchar();
函數的功能是從(cong) 鍵盤輸入一個(ge) 字符,返回值是該字符的ASCII碼值。
【例1. 3】getchar()函數的使用
#include<stdio.h> int main() { int ch; ch = getchar(); //從(cong) 鍵盤輸入字符,該字符的ASCII碼值賦給 ch putchar(ch); //輸出 ch對應的字符 return 0; }
運行結果:
a
a
注意:
執行getchar()函數輸入字符時,輸入字符後需要敲一個(ge) 回車鍵(Enter),回車後才繼續執行程序。getchar()函數也將空白符作為(wei) 一個(ge) 有效字符讀入。因此,在getchar()函數連續輸入多個(ge) 字符時要連續輸入,中間不要加空白符。
常量
在程序運行過程中,其值不能被改變的量稱為(wei) 常量。
常用的常量有以下幾類:
1.整型常量
即沒有小數部分的數。例如:2,-345,43
除了十進製,還可用八進製和 十六進製來表示整數。
2.浮點型常量
浮點型常量有兩(liang) 種表現形式:
(1)十進製小數形式,由數字和小數點組成。
注意:在一個(ge) 值後麵加上一個(ge) 小數點,該值就是一個(ge) 浮點數。例如:3是整數,3.00 、3. 都是浮點數。
(2)指數形式
例如:3.14e3(表示3.14×10³),–193e–3(表示–193×10﹣²³),0.123E2(表示0.123×10²)。
需要注意的是,e或E之前必須有數字,且e或E後麵必須為(wei) 整數,如不能夠寫(xie) e4,12e0.2
3.字符常量
兩(liang) 種形式:
(1)普通字符,用單引號括起來的單個(ge) 字符。
例:‘A’,‘b’,‘9’,‘?’
(2)轉義(yi) 字符
C語言還允許用一種特殊形式的字符常量,就是用單引號括起來,以字符 \ 開頭的字符序列。
轉義字符
轉義字符 | 含義 |
---|---|
\n | 換行 |
\f | 清屏並換頁 |
\r | 回車 |
\t | Tab符,水平製表符 |
\v | 垂直製表符 |
\b | 退格 |
\\ | 反斜杠(\) |
\’ | 單引號 |
\" | 雙引號 |
\a | 報警 |
\0 | 空值 |
\? | 在書寫連續多個問號時使用,防止他們被解析成三字母詞 |
\0ooo | 八進製值(ooo必須是有效地八進製數,即每個o表示0~7中的一個數) |
\xhh | 十六進製值(hh必須是有效的十六進製數,即每個h表示0~f 中的一個數) |
科普三字母詞:
??) ——> ]
??( ——> [
4.字符串常量
由一對雙引號括起來的字符序列。如:“China”,“中國”,“a”
雙引號不是字符串的一部分。
字符串的結束標誌是 \0,不算做字符串內(nei) 容。
存儲(chu) :
例:char a[10]=“abcdef”;
char類型的數組a[10],存放字符串abcdef。
#include<stdio.h> int main() { char s[] = "abdef";//字符串包含了\0,打印輸出時遇到\0就結束程序 char a[] = { 'a','b','c','d','e','f','\0'};//這裏一定要加\0,否則打印輸出時會(hui) 出錯 printf("%s\n",s); printf("%s\n",a); printf("abc\0def\n"); }
運行結果:
abcdef
abcdef
abc
5.define定義的標識符常量
可以用#define預處理指令來定義(yi) 一個(ge) 符號常量。例如:
#define PI 3.14
編譯程序時,程序中所有的PI都會(hui) 被替換成3.14。通常,這樣定義(yi) 的常量也稱為(wei) 符號常量。
格式:#define 符號常量名 符號常量的值
三者之間用空格隔開。為(wei) 了和變量名區分開來,習(xi) 慣上符號常量用大寫(xie) 字符表示。
#include<stdio.h> #define MAX 100//定義(yi) MAX,其值是100 #define STR "abcdef" //STR,abcdef是字符串 int main() { printf("%d\n",MAX); int a=MAX; printf("%d\n",a); printf("%s\n",STR);//%s 是字符串輸出符 return 0; }
運行結果:
100
100
abcdef
6.枚舉常量
一般形式:
enum 枚舉(ju) 類型名{ 常量1,常量2,常量3,…};
可以一 一列舉(ju) 出來的
#include<stdio.h> enum Color//類型 { //這三個(ge) 是枚舉(ju) 常量,可能取值的 RED, GREEN, BLUE }; int main() { int num = 10; enum Color a = RED; enum Color b = GREEN; enum Color c = BLUE; printf("%d\n",a); printf("%d\n",b); printf("%d\n",c); return 0; }
運行結果:
0
1
2
枚舉(ju) 類型在使用中有以下規定:1
1、枚舉(ju) 值是常量,不是變量。不能在程序中用賦值語句再對它賦值。例如對枚舉(ju) weekday的元素再作以下賦值: sun=5;mon=2;sun=mon; 都是錯誤的。
2、枚舉(ju) 元素本身由係統定義(yi) 了一個(ge) 表示序號的數值,從(cong) 0 開始順序定義(yi) 為(wei) 0,1,2,… 。如在weekday中,sun值為(wei) 0,mon值為(wei) 1, …,sat值為(wei) 6。
變量
在程序運行過程中,其值能被改變的量稱為(wei) 變量。
const修飾的常變量
const修飾的變量,常屬性不能被改變。使用const在一定程度上可以提高程序的安全性和可靠性。
const修飾的數據類型是指常類型,常類型的變量或對象的值是不能被改變的。
#include<stdio.h> int main() { const int a = 10;//在C語言中,const修飾的a,本質是變量,但是不能被修改,有著常量的屬性 printf("%d",a); return 0; }
運行結果:
10
const int Max = 100; Max++; //程序錯誤
如果想修改Max的值,可定義(yi) 一個(ge) 指向Max的指針,通過指針來改變Max的值,注意GCC8.2和Clong8.0均會(hui) 產(chan) 生警告。
const int Max = 100; int *p = &Max; *p = 101; //GCC8.2 會(hui) 產(chan) 生警告,並輸出Max = 101 //Clong8.0 會(hui) 產(chan) 生警告,且Max值未改變 規定符
轉換說明 | 輸出結果 |
---|---|
%d、%i | 十進製有符號整數 |
%u | 十進製無符號整數 |
%f | 浮點數 |
%lf | double浮點數 |
%s | 字符串 |
%c | 單個(ge) 字符 |
%p | 指針的值(輸出地址符) |
%e、%E | 指數形式的浮點數 |
%x,%X | 無符號以十六進製表示的整數 |
%o | 無符號以八進製表示的整數 |
%g、%G | 把輸出的值按照%e或者%f類型中輸出長度較小的方式輸出 |
%lu | 32位無符號整數 |
%llu | 64位無符號整數 |
%zu | 打印sizeof 的返回值 |
%% | 輸出一個(ge) 百分號 |
說明
(1) 可以在“%”和字母之間插進數字表示最大場寬。
例如:%3d 表示輸出3位整型數,不夠3位右對齊。
%9.2f 表示輸出場寬為(wei) 9的浮點數,其中小數位為(wei) 2,整數位為(wei) 6,小數點占一位,不夠9位右對齊。
%8s 表示輸出8個(ge) 字符的字符串,不夠8個(ge) 字符右對齊。
如果字符串的長度、或整型數位數超過說明的場寬,將按其實際長度輸出。但對浮點數,若整數部分位數超過了說明的整數位寬度,將按實際整數位輸出;若小數部分位數超過了說明的小數位寬度,則按說明的寬度以四舍五入輸出。
另外,若想在輸出值前加一些0,就應在場寬項前加個(ge) 0。
例如:%04d 表示在輸出一個(ge) 小於(yu) 4位的數值時,將在前麵補0使其總寬度為(wei) 4位。
如果用非浮點數表示字符或整型量的輸出格式,小數點後的數字代表最大寬度,小數點前的數字代表最小寬度。
例如:%6.9s 表示顯示一個(ge) 長度不小於(yu) 6且不大於(yu) 9的字符串。若大於(yu) 9,則第9個(ge) 字符以後的內(nei) 容將被刪除。
(2) 可以在“%”和字母之間加小寫(xie) 字母 l,表示輸出的是長型數。
例如:%ld 表示輸出 long 整數
%lf 表示輸出 double 浮點數
(3) 可以控製輸出左對齊或右對齊,即在"%" 和字母之間加入一個(ge) " - "號可說明輸出為(wei) 左對齊, 否則為(wei) 右對齊。
例如:%-7d 表示輸出7位整數左對齊
%10s 表示輸出10個(ge) 字符右對齊
1.算術運算符
運算符 | 含義 | 範例 | 結果 |
---|---|---|---|
+ | 加法 | x+y | x和y的和 |
– | 減法 | x–y | x和y的差 |
* | 乘法 | x * y | x和y的積 |
/ | 除法 | x / y | x和y的商 |
% | 求餘 | x%y | x除以y的餘數 |
+ | 正號 | +x | x的值 |
– | 負號 | –x | x的相反數 |
注意:
(1)運算符%要求左右兩(liang) 個(ge) 運算數據必須為(wei) 整型數據,如5%2的值為(wei) 3。
(2)相除時,結果為(wei) 整數,小數部分舍去。但若除數或被除數中有一個(ge) 為(wei) 負值,則舍入的方向是不固定的。如5/3=1,但–5/3在有的計算機得到的結果是–1,而有的計算機上的結果是–2。C99規定采取 “向零取整” 的方法,即取整後向零取整。
(3)字符型數據可以和數值型數據進行運算,因為(wei) 字符型數據在計算機中是用一個(ge) 字節的整型數(ASCII碼)表示的。如 ‘A’+1在進行運算時會(hui) 把A的ASCII碼65與(yu) 1相加,最後得出結果就是66。
【例1. 4】算術運算符的使用
#include<stdio.h> int main() { printf("%d %% %d = %d\n",-7,4,-7%4);//求餘(yu) return 0; }
運行結果:
-7 % 4 = -3
這裏有兩(liang) 個(ge) %,是為(wei) 了在顯示器上顯示出來%。
2.賦值運算符
(1)簡單賦值運算
“ = ”的作用是將賦值符號右邊的對象的值賦值給左邊的對象。例:x = 9;
把值9賦給x,實際意義(yi) 是將10存儲(chu) 到x的存儲(chu) 單元中。
此處“ = ”是賦值符,而非等於(yu) 號。等於(yu) 號是“ == ”,例如:if(x==10),意思是如果x等於(yu) 10。
注:①10 = x是無效語句。賦值運算符的左側(ce) 必須是一個(ge) 運算對象,此對象的值可以改變。10是整數常量,不能改變其值,不能給常量賦值。
②若參與(yu) 賦值運算的運算對象的數據類型不同,則右邊對象的數據類型會(hui) 被轉換成左側(ce) 對象的類型。
(2)複合賦值運算
在賦值運算符前加上其他運算符,例如在“ = ” 前加上“ + ”,運算符就變成了複合運算符“ += ”。
例:x += 10;
相當於(yu) x = x+10;
其他算術運算符也可以與(yu) 賦值運算符組合成複合賦值運算符。
【例1. 5】a = 5,求a += a – = a * a。
#include<stdio.h> int main() { int a = 5; a += a -=a * a; printf("a = %d\n",a); return 0; }
運算結果:
a = – 40
3.關係運算符
關係運算符 | 含義 | 範例 |
---|---|---|
< | 小於 | x<y |
> | 大於 | x>y |
<= | 小於或等於 | x<=y |
>= | 大於或等於 | x>=y |
== | 等於 | x==y |
!= | 不等於 | x!=y |
關(guan) 係運算符的結合性是“ 從(cong) 左到右 ”。a < b > c <= d 與(yu) ( (a < b) > c) <= d 相同。
注意:浮點數之間進行比較時,盡量隻使用 “ < ” 和 “ > ”。因為(wei) 浮點數使用近似值表示的,這會(hui) 導致邏輯上相等的兩(liang) 數卻不相等。
4.邏輯運算符
邏輯運算符 | 含義 | 範例 |
---|---|---|
&& | 邏輯與 | x && y |
∣∣ | 邏輯或 | x ∣∣ y |
! | 邏輯非 | !x |
在邏輯運算中,如果運算對象的值為(wei) 非0,則認為(wei) 是邏輯真,否則認為(wei) 是邏輯假。真用 1 表示,假用 0 表示。
邏輯非
例:int a=5;
!a的結果為(wei) 0,因為(wei) a不等於(yu) 0。
a | b | !a | !b | a&&b | a∣∣b |
---|---|---|---|---|---|
真 | 真 | 假 | 假 | 真 | 真 |
真 | 假 | 假 | 真 | 假 | 真 |
假 | 真 | 真 | 假 | 假 | 真 |
假 | 假 | 真 | 真 | 假 | 假 |
運算符 ! 的結合性是“ 從(cong) 右到左 ”,而&&和 || 的結合性是“ 從(cong) 左到右 ”。
在多個(ge) &&(或 ||)相連時,因結合性是從(cong) 左到右,故當左邊的運算對象為(wei) 假(或真),停止運算。
5.其他運算符
自增、自減運算符
自增運算符++
當 i 變量每次都要加1時,可寫(xie) 為(wei) i++,或++i
相當於(yu) i = i +1;
自減運算符 – –
當 i 變量每次都要減1時,可寫(xie) 為(wei) i – – 或 – – i
相當於(yu) i = i – 1;
自增、自減運算符的結合性是“ 從(cong) 右到左 ”。x * y++ 相當於(yu) x * (y++),而並非是(x * y)++。
sizeof運算符
一般形式:sizeof(運算對象)
圓括號可有可無,但是當運算對象是數據類型是,必須加上圓括號。
例如:sizeof(int), sizeof x, sizeof(x), sizeof 34, sizeof(34)
sizeof的結合性是“ 從(cong) 右到左 ”。
如果運算對象是表達式,那表達式將不會(hui) 被執行,隻會(hui) 輸出此表達式的數據類型所占的字節數。
#include<stdio.h> int main() { int a = 12,b = 1; printf("%zd\n",sizeof(a = a+b); printf("a = %d\n",a); return 0; }
運算結果:
4
a = 12
sizeof運算的結果是一個(ge) 無符號整數類型。C99新增了轉換說明%zd用於(yu) 輸出 sizeof 運算結果的值。如果編譯器不支持使用%zd,可以使用 %u 或 %lu 代替 %zd。
逗號運算符
逗號運算符(,)用於(yu) 將兩(liang) 個(ge) 表達式連接時。如:
a+b , a+c
一般形式:表達式1 , 表達式2
求解過程:先求表達式1,再求表達式2。整個(ge) 逗號表達式的值是表達式2的值。
一個(ge) 逗號表達式又可以與(yu) 另一個(ge) 表達式組成一個(ge) 新的逗號表達式。所以逗號表達式的一般形式又可拓展為(wei) :
表達式1, 表達式2, 表達式3, … , 表達式 n
注意:逗號也用作分隔符。下麵代碼中的逗號都是分隔符,而非逗號運算符。
int a,b; printf("%d %d",a,b); ASCII碼表
運算符的優先級 ★★數據類型C語言的數據類型十分豐(feng) 富,如下:(此處若概括不全,還望指出)
基本類型
整數類型
基本整型(int)
(1)聲明 int 型變量
形式:int 變量名;
如:int num;
(2)初始化變量
初始化就是為(wei) 變量賦值。可以在聲明的同時賦值,如:int num = 4;
聲明是給變量創建存儲(chu) 空間,初始化就是給變量定一個(ge) 初始值。
其他整數類型
短整型(short int)
類型名為(wei) short int(或簡寫(xie) 成 short)。short型是有符號類型,占用的存儲(chu) 單元可能比 int 小,常用於(yu) 較小數值的場合以節省空間。
長整型(long int)
類型名為(wei) long int(或簡寫(xie) 成 long)。long型是有符號類型,占用的存儲(chu) 單元可能比int 型大,常用於(yu) 較大數值的場合。
雙長整數(long long int)
類型名為(wei) long long int 或long long(C99標準加入)。long long 型占用的存儲(chu) 單元可能比 long型大,適用於(yu) 更大數值的場合。該類型至少占64位,即8個(ge) 字節,是有符號類型。
聲明其他整數類型與(yu) int型相同,如:
short s_count;
long int count;
long long ago;
(4)無符號的整數類型
所有有符號類型前加上關(guan) 鍵字 unsigned,就變成無符號的整數類型。此類型隻用於(yu) 非負值得場合,取值範圍也與(yu) 有符號類型不同。
任何有符號類型前加上signed 並無實際意義(yi) ,隻起到強調作用。
整數溢出
在給某一類型變量賦值時,超過取值範圍就會(hui) “溢出”,輸出的結果就是錯誤的。
字符類型
char 型用來存儲(chu) 字符,但計算機使用數字編碼來處理字符,即用特定的整數來表示特定的字符。目前最通用的編碼是ASCII碼。
標準ASCII碼的編碼範圍是0~127,隻需要7位二進製數表示即可。char 型通常被定義(yi) 為(wei) 8位的存儲(chu) 單元,因此足以滿足存儲(chu) ASCII表中的字符。
(1)聲明char 型變量
char ch;
char color,choose;
以上聲明創建了三個(ge) 變量,並分別分配了一個(ge) 字節的的存儲(chu) 單元。
(2)char 型變量初始化
若要字符變量初始化為(wei) 字母A,如:
char grade = ‘A’;
字母A的ASCII碼是65,係統把整數65賦值給grade。
對於(yu) 特殊字符可以用轉義(yi) 字符的形式來給變量賦值。
char ch; //聲明一個(ge) char 型的變量
ch = ‘\n’; //初始化為(wei) 換行符,把ASCII碼10賦給ch
ch = ‘\12’; //換行符的八進製表示
ch = ‘\xa’; //換行符的十六進製表示
存儲(chu) 字符實際上存儲(chu) 的是整數,故也可用整數來賦值。
char grade = 65; //65是A的ASCII碼值
char ch = 10; //10是換行符的ASCII碼值
注意數字不要超過127,否則會(hui) 出錯。
浮點型類型
C語言中的浮點數類型有 float型(單精度浮點型)、double型(雙精度浮點型)和 long double型(長雙精度浮點型)。
float型必須至少能表示6位有效數字,且取值範圍至少是10-37~10+37。通常,係統存儲(chu) 一個(ge) float型要占用32位,其中8位用來存儲(chu) 指數的值和符號,剩下的24位用於(yu) 存儲(chu) 非指數部分及其符號。
double型和 float型的最小取值範圍相同,但至少能表示10位有效數字。通常,double型占用64位,因此比 float型精度更高,取值範圍更大。
如精度要求更高,可用 long double型。
初始化:
float pi;
pi=3.14
double area,quart;
float weight = 6.5e - 34;
long double g;
例: 計算數據類型的大小
#include<stdio.h> int main() { printf("int:%zd\n",sizeof(int)); printf("short:%zd\n",sizeof(short)); printf("long:%zd\n",sizeof(long)); printf("long long:%zd\n",sizeof(long long)); printf("char:%zd\n",sizeof(char)); printf("float:%zd\n",sizeof(float)); printf("double:%zd\n",sizeof(double)); printf("long double:%zd\n",sizeof(long double)); return 0; }
運行結果:
int:4
short:2
long:4
long long:8
char:1
float:4
double:8
long double:16
強製類型轉換
一般形式:
(類型名)表達式
例:a=(int)1.4+(int)1.5;
注意:強製類型轉換符右側(ce) 如果是變量,會(hui) 把變量的值轉換成圓括號中指定的數據類型,變量本身的類型不會(hui) 改變。
int a = 10; (float)a + 3.14;
變量a的值(10)被強製轉換成float型,再和3.14相加。但a的類型還是int型,其值仍為(wei) 10。
剩下的其他數據類型,我們(men) 將在其具體(ti) 的知識點中講到。
C語言程序的結構(簡單了解即可)(1)一個(ge) 程序由一個(ge) 或多個(ge) 源程序文件組成。
一個(ge) 源文件可以包括3個(ge) 部分:
①預處理指令。如:#include,#define
②全局聲明。放在函數外聲明的是全局變量,函數內(nei) 聲明的是局部變量。
③函數定義(yi) 。
(2)函數是 c程序中的主要組成部分。
(3)一個(ge) 函數包括兩(liang) 部分。
①函數首部。即函數的第一行,包括函數名,函數類型,函數屬性,函數參數(形式參數)名,參數類型。
一個(ge) 函數名後麵必須跟一對圓括號,括號內(nei) 寫(xie) 函數的參數名及其類型。如果函數沒有參數,可以在括號中寫(xie) void,也可以是空括號。
int main(void) 或 int main()
②函數體(ti) 。
- 聲明部分。變量,調用的函數進行聲明。
- 執行部分。函數中的若幹語句。
(4)程序總是從(cong) main函數開始執行的。
(5)程序中要求計算機的操作是由函數中的C語句完成的。
(6)在每個(ge) 數據聲明和語句的最後必須有一個(ge) 分號。
(7)C語言本身不提供輸入輸出語句。
(8)程序應當包含注釋。必要的注釋,可以增加程序的可讀性。
三、算法——程序的靈魂
程序=算法+數據結構程序 =(對數據的描述)數據結構+(對操作的描述)算法
數據結構 =個(ge) 體(ti) + 個(ge) 體(ti) 的關(guan) 係
算法 = 對存儲(chu) 數據的操作
算法的概念:算法是解決(jue) 問題的方法和步驟。
算法的特征
(1)有窮性
一個(ge) 算法必須總是在執行有窮步後結束,且每一步都必須在有窮時間內(nei) 完成。
(2)確定性
每種情況所執行的操作,在算法中都有確切的規定,不會(hui) 產(chan) 生二義(yi) 性。
(3)可行性
算法中的所有操作都可以通過已經實現的基本操作運算執行有限次來實現。
(4)零個(ge) 或多個(ge) 輸入
(5)一個(ge) 或多個(ge) 輸出
衡量算法的標準
1.時間複雜度
大概程序要執行的次數,而非執行的時間
2.空間複雜度
算法執行過程中大概所占用的最大內(nei) 存
3.難易程度
4.健壯性
部分常用的算法
1.迭代法
2.枚舉(ju) 法
依據問題的部分條件,確定答案的大致範圍,然後逐一驗證所有可能的情況,這種算法也叫窮舉(ju) 法。
3.遞歸法
函數的自調用
n! 的遞歸調用算法描述
void fun(int n) { int f; if(n==1) f=1; else f=f*fun(n-1); }
4.遞推法
由已知條件,得出中間推論,直至得到結果。
F(1)=1,F(2)=1; F(n)=F(n-1)+F(n-2);
算法咱就不講深了,算法課會(hui) 學的。
總結
本篇適用於(yu) 零基礎或初學C語言的小夥(huo) 伴們(men) ,本人也隻是個(ge) 小菜鳥,根據教材和教輔資料總結出來的C語言入門(一),如有錯誤的地方,或需要改進的,還望各位指點一二。
建議初學者,一定要邊看邊練,多多練習(xi) ,才能更加深刻的理解代碼的含義(yi) 。