摘要:注在語言中如何表示真假呢表示真,非表示假。用于終止本次循環,也就是本次循環中后面的代碼不會再執行,而是直接跳轉到語句的判斷部分,進入下一次循環判斷。形式參數當函數調用完成之后就自動銷毀了。
C語言是一門面向過程的計算機編程語言,廣泛應用于底層開發,與C++、java等面向對象的編程語言有所不同。Cyuyan的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
#include //頭文件int main()//main函數為程序入口,一個工程中main函數僅有一個{ printf("hello/n"); return 0;//return函數結束,后面不執行}
數據類型 | 打印方式 | |
char | 字符 | %c |
short | 短整型 | %d |
int | 整型 | %d |
long | 長整型 | %d/%ld |
float | 單精度浮點數 | %f |
double | 雙精度浮點數 | %lf |
? ? ? ?注:打印八進制數(%0),打印十六進制數(%0x)
(1)變量的作用域和生命周期
a、局部變量作用域為變量所在的局部范圍。
b、全局變量作用域為整個工程。
變量對應的生命周期為該變量的作用域。
(2)C語言中常量分類
轉義字符 | 釋義 |
/" | 表示字符常量" |
/" | 表示字符串內部的雙引號 |
// | 表示反斜杠 |
/b | 退格 |
/n | 換行 |
/r | 回車 |
/ffffd | ffffd表示1~3個八進制數字 |
/xdd | dd表示兩個十六進制數字 |
注:幾個常用快捷鍵
Ctrl+k+f? ? ? ? ?//整理代碼格式
Ctrl+k+c?? ? ? ?//整體注釋
Ctrl+k+u? ? ? ? //取消注釋
(1)if語句
“=”表示賦值,“==”判斷相等,“!=”判斷不相等。
//多分支情況
if (表達式)
{
?? ?語句一;
}
else if (表達式)
{
?? ?語句二;
}
else
{
?? ?語句三;
}
如果表達式為真,則語句執行。
注:在C語言中如何表示真假呢?
0表示真,非0表示假。
(2)switch語句(常用于多分支情況)
比如:
輸入1:輸出星期一
輸入2:輸出星期二
輸入3:輸出星期三
輸入4:輸出星期四
輸入5:輸出星期五
輸入6:輸出星期六
輸入7:輸出周日
如果用if語句的話會顯得很麻煩,我么們可以用switch語句來實現。
#includeint main(){ int day = 0; scanf("%d", &day); switch (day)//條件只能是整型 { case 1: //case后面只能是整型常量 printf("星期一/n"); break; case 2: printf("星期二/n"); break; case 3: printf("星期三/n"); break; case 4: printf("星期四/n"); break; case 5: printf("星期五/n"); break; case 6: printf("星期六/n"); break; case 7: printf("周天/n"); break; } return 0;}
(1)while循環
在屏幕上打印1-10的數字
#includeint main(){ int i = 1; while (i <= 10) { printf("%d ", i); i++; } return 0;}
while循環里的break和continue
(2)for循環
for(表達式一;表達式二;表達式三)
? ? ? ?循環語句;
表達式一用于初始化循環變量。表達式二條件判斷部分,用于判斷循環是否終止。表達式三用于循環條件的調整。
使用for循環在屏幕上打印1-10數字
#includeint main(){ int i = 0; //for (i = 1/*初始化*/; i <= 10/*判斷部分*/; ++i/*調整部分*/) for (i = 1; i <= 10; ++i) { printf("%d ", i); } return 0;}
注:1、不可在for循環內修改循環變量,防止for循環失去控制。
? ? ? ?2、建議for語句的循環控制變量的取值采用前閉后開區間寫法。
(3)do……while()循環
do
? ? ? 循環語句;
while(表達式);
特點:循環至少執行一次,適用的場景有限,所以不是經常使用。
C語言函數分類:庫函數、自定義函數
注: 但是庫函數必須知道的一個秘密就是:使用庫函數,必須包含 #include 對應的頭文件。
ret_type fun_name(para1, * )//ret_type返回類型,fun_name函數名,para1函數參數{statement;//語句項}
舉一個例子:
寫一個函數可以找出兩個整數中的最大值。
#include //get_max函數的設計int get_max(int x, int y){ return (x>y) ? (x) : (y);}int main(){ int num1 = 10; int num2 = 20; int max = get_max(num1, num2); printf("max = %d/n", max); return 0;}
形式參數(形參):
真實傳給函數的參數,叫實參。實參可以是:常量、變量、表達式、函數等。無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。
實際參數(實參):
形式參數是指函數名后括號中的變量,因為形式參數只有在函數被調用的過程中才實例化(分配內存單元),所以叫形式參數。形式參數當函數調用完成之后就自動銷毀了。因此形式參數只在函數中有效。
上面代碼x、y為形參,num1、num2為實參。形參實例化之后其實相當于實參的一份臨時拷貝。
(1)函數聲明
test.h放置函數聲明
#ifndef __TEST_H__#define __TEST_H__//函數的聲明int Add(int x, int y);#endif //__TEST_H__
(2)函數定義:交待函數的功能實現。
?test.c放置函數定義
#include "test.h"http://函數Add的實現int Add(int x, int y){ return x+y;}
(1)什么是遞歸?
把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。 遞歸的主要思考方式在于:把大事化小
(2)遞歸的兩個必要條件
例:求斐波那契數
int fib(int n){ if (n <= 2) return 1; else return fib(n - 1) + fib(n - 2);}
代碼在運行時存在以下問題:
在調試 factorial 函數的時候,如果你的參數比較大,那就會報錯:stack overflow(棧溢出這樣的信息)。 系統分配給程序的棧空間是有限的,但是如果出現了死循環,或者(死遞歸),這樣有可能導致一直開辟棧空間,最終產生棧空間耗盡的情況,這樣的現象我們稱為棧溢出。
注:
1. 許多問題是以遞歸的形式進行解釋的,這只是因為它比非遞歸的形式更為清晰。
2. 但是這些問題的迭代實現往往比遞歸實現效率更高,雖然代碼的可讀性稍微差些。
3. 當一個問題相當復雜,難以用迭代實現時,此時遞歸實現的簡潔性便可以補償它所帶來的運行時開銷。
(1)數組創建
type_t arr_name [const_n];//type_t 是指數組的元素類型//const_n 是一個常量表達式,用來指定數組的大小
注:數組創建, [] 中要給一個常量才可以,不能使用變量。數組在創建的時候如果想不指定數組的確定的大小就得初始化。數組的元素個數根據初始化的內容來確定。
(2)一維數組的使用、在內存中的存儲
a、數組是使用下標來訪問的,下標是從0開始。?數組的大小可以通過計算得到。
b、在內存中的存儲
?隨著數組下標的增長,元素的地址,也在有規律的遞增。 由此可以得出結論:數組在內存中是連續存放的。
(1)二維數組初始化
//數組初始化int arr[3][4] = {1,2,3,4};//其余的為0int arr[3][4] = {{1,2},{4,5}};int arr[][4] = {{2,3},{4,5}};//
注:
二維數組行標可以省略,列標不能省略;數組計算長度只有在定義時使用有效。
(2)二維數組在內存中的存儲
二維數組在內存中也是連續存在的。二維數組是特殊的一維數組。
注:數組名代表數組首元素地址。
(兩個例外,sizeof(arr)、&arr)
算術操作符、移位操作符、位操作符、賦值操作符、單目操作符、關系操作符、邏輯操作符、條件操作符、逗號表達式
< ? ?左移操作符
>>? ? ?右移操作符
(1)左移操作符
左邊拋棄、右邊補0
(2)右移操作符
1. 邏輯移位 左邊用0填充,右邊丟棄
2. 算術移位 左邊用原該值的符號位填充,右邊丟棄
&? ? ? ?//按位與,兩位都為1時為1
|? ? ? ? //按位或,對應位為1,結果為1
^? ? ? ?//按位異或,不一樣的位為1,一樣為0
注:他們的操作數必須是整數。
0異或任何數為數字本身;兩個相同的數字異或為0。
邏輯操作符有哪些?
&&? ? ? ? 邏輯與(短路與)
||? ? ? ? ? ?邏輯或(短路或)
區分邏輯與和按位與 區分邏輯或和按位或
1 & 2?----->?0
1 && 2?---->?1
1 | 2?----->?3
1 || 2?---->?1
exp1 ? exp2 : exp3
//exp1為真,執行exp2,否則執行exp3
exp1, exp2, exp3, …expN
逗號表達式,就是用逗號隔開的多個表達式。 逗號表達式,從左向右依次執行。整個表達式的結果是最后一個表達式的結果。
在計算機科學中,指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向
(points to)存在電腦存儲器中另一個地方的值。由于通過地址能找到所需的變量單元,可以說,地址指向該變量單元。因此,將地址形象化的稱為“指針”。意思是通過它能找到以它為地址的內存單元。
?
總結:
概念: 野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)。
(1)野指針成因
#include int main(){ int *p;//局部變量指針未初始化,默認為隨機值 *p = 20;return 0;}
#include int main(){ int arr[10] = { 0 }; int *p = arr; int i = 0; for (i = 0; i <= 11; i++) { //當指針指向的范圍超出數組arr的范圍時,p就是野指針 *(p++) = i; } return 0;}
如何規避野指針?
1. 指針初始化
2. 小心指針越界
3. 指針指向空間釋放即使置NULL
4. 指針使用之前檢查有效性
例如描述一個學生:
typedef struct Stu{ char name[20];//名字 int age;//年齡 char sex[5];//性別 char id[20];//學號}Stu;//分號不能丟
結構體成員的類型:
結構的成員可以是標量、數組、指針,甚至是其他結構體。
struct Point{ int x; int y;}p1; //聲明類型的同時定義變量p1struct Point p2; //定義結構體變量p2//初始化:定義變量的同時賦初值。struct Point p3 = {x, y};
#includestruct S{ int data[1000]; int num;};struct S s = { { 1, 2, 3, 4 }, 1000 };//結構體傳參void print1(struct S s){ printf("%d/n", s.num);}//結構體地址傳參void print2(struct S* ps){ printf("%d/n", ps->num);}int main(){ print1(s); //傳結構體 print2(&s); //傳地址 return 0;}
上面的 print1 和 print2 函數哪個好些?
答案是:首選print2函數。 原因:
函數傳參的時候,參數是需要壓棧的。 如果傳遞一個結構體對象的時候,結構體過大,參數壓棧的系統開銷比較大,所以會導致性能的下降。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124499.html
摘要:而面向搜索引擎,就是我們要及時的使用百度谷歌遇到問題無法解決,先別急著放棄,可以去網絡尋找答案,你的坑大部分別人都已經走過了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語言,到底哪一門才是適合我的?●我們為什么要學習Java語言呢...
摘要:是你學習從入門到專家必備的學習路線和優質學習資源。的數學基礎最主要是高等數學線性代數概率論與數理統計三門課程,這三門課程是本科必修的。其作為機器學習的入門和進階資料非常適合。書籍介紹深度學習通常又被稱為花書,深度學習領域最經典的暢銷書。 showImg(https://segmentfault.com/img/remote/1460000019011569); 【導讀】本文由知名開源平...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
摘要:入門,第一個這是一門很新的語言,年前后正式公布,算起來是比較年輕的編程語言了,更重要的是它是面向程序員的函數式編程語言,它的代碼運行在之上。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。 showImg(https://segmentfault.com/img/bV1xdq?w=900&h=385); 新的一年不知不覺已經到來了,總結過去的 2017,相信小伙們一定有很多收獲...
閱讀 2654·2021-11-23 09:51
閱讀 3246·2021-11-22 14:44
閱讀 4575·2021-11-22 09:34
閱讀 5099·2021-10-08 10:14
閱讀 2402·2021-09-22 15:47
閱讀 3501·2021-09-22 15:40
閱讀 1510·2019-08-30 15:44
閱讀 1619·2019-08-28 18:23