學習筆記3-C語言-基礎

C語言簡介

發展史:BCPL ->  new B  ->  C ->  Minix -> Linux -> gcc
C語言誕生:  1970年~1973年,在肯.湯姆遜和丹尼斯.里奇(影響大)主導下編寫完成,歸屬美國貝爾實驗室
C語言的誕生專門用于編寫操作系統,所以天生適合一些硬件編程,也以速度快著稱,也非常適合實現數據結構和算法
由于出現時間過早,也沒想到普通人也能使用C語言編程,因此存在著很多缺陷,但是前輩已經總結了一些避免陷阱的經驗
C語言三劍客:《C語言陷阱與缺陷》、《C指針》《C專家編程》
C語言語法很自由,自由也意味著危險,自由源于自律語法標準:C89語法標準,也是gcc默認的語法標準C99語法標準,對C語言的擴展和增強C11語法標準,全新的升級 

一、第一個C語言程序:helld world

#include<stdio.h>
開頭#預處理程序員寫的代碼不是標準C代碼,需要一段程序進行翻譯成標準C代碼,負責翻譯的程序叫做預處理器,翻譯的過程叫預處理,被翻譯的代碼叫做預處理指令,以#開頭的都是預處理指令#include 的功能就是把一個頭文件導入到當前文件夾中#include<>:從系統指定的目錄下加載xxx.h#include"":先從當前目錄下加載xxx.h,如果找不到,再從系統指定目錄找stdio.h  標準輸入輸出庫函數頭文件:以.h結尾的文件,里面存儲的是一些輔助性的代碼,絕大多數都是函數的聲明源文件:以.c結尾的文件,里面存儲的是功能性代碼C語言標準委員會為C語言以函數的形式提供了一些基礎的功能,這些函數都會封裝在libc.so庫中很多頭文件負責對libc.so庫中的代碼進行聲明,stdio.h就是其中一個string.h   stdlib.hint main()C語言以函數的形式來管理代碼,是管理代碼的最小單位,一個函數就是一段代碼的集合main函數是C程序的主函數,是整個C程序的執行入口和出口,有且只有一個int 是一種數據類型,表示函數的返回值類型是一個整數main函數的返回值返回給操作系統,main函數是由操作系統所調用的,反映了該程序是如何結束的,通常有三種:正數 出現異常(別人的錯誤)0    一切正常負數 出現錯誤(自己的錯誤)echo $?  可以獲取上一個程序的返回值
{printf("hello world");return 0;
}printf/scanf都是標準庫中的函數,負責輸入輸出數據,用來調試程序
轉義字符:鍵盤上一些沒有的符號,用一些特殊的字符來表示,這些特殊的字符就是轉義字符,\n就是其中之一。\n 換行\t 制表符,用于對齊數據\r 光標回到行首\a 鈴響\b 退一個字符%% 表示%\\ 表示\
C語言中以分號作為一行代碼的結束標注,使用{}來劃分區域

二、編譯器

把人能看懂的代碼組成的文件,翻譯成計算機能看懂二進制文件,由預處理器、編譯器、鏈接器組成。
gcc是HNU社區為了編譯Linux代碼而開發的一款免費的編譯器,默認采用C89語法標準,-std=gnu99可以設置C99語法常用的參數:-E 只顯示與處理的結果-c 只編譯不鏈接-o 指定輸出結果的名字-I 指定頭文件的加載路徑-S 進行匯編,生成匯編代碼-l 指定要使用的庫文件-Wall 盡可能多的產生警告-Werror 把警告當錯誤處理-std 指定編譯語法-D 命令行定義宏

三、C代碼變成可執行程序的過程

1、預處理:把源文件翻譯成預處理文件     一般用于查看宏定義的替換結果,檢查宏函數gcc -E code.c   顯示預處理處理的結果        gcc -E code.c -o code.i   生成以i結尾的預處理文件 
2、編譯:把預處理文件翻譯成匯編文件     理解C/C++代碼的底層工作原理 函數重載原理gcc -S code.i   生成以.s結尾的匯編文件 
3、匯編: 把匯編文件翻譯成2進制的目標文件       生成代碼庫、靜態庫、共享庫gcc -c code.s   生成以o為結尾的目標文件
4、鏈接:把若干個目標文件合并成一個可執行文件       多文件編程的基礎gcc code.o a.o b.o c.o ...   默認生成一個a.out的可執行文件

四、不同的C文件類型

    .h 頭文件.h.gch 頭文件的編譯結果,它會被優先使用.c 源文件.i 預處理文件.s 匯編文件.o 目標文件.a 靜態庫.so 共享庫

五、數據的儲存單位

Bit     比特    一個二進制位,只能存0或者1,計算機中存儲數據的最小單位
Byte    字節    8個二進制位,計算機中存儲數據的基本單位
KB      1024字節
MB      1024KB
GB      1024MB
TB      1024GB
PB      1024TB

六、數據類型

為什么要對數據分類:1、現實生活中的數據都是自帶類別屬性2、對數據進行分類可以節約儲存空間,提高運行的效率C語言中的數據分為兩大類:自建(程序員自己設計,例如:結構、聯合、類)、內建(C語言中自帶)
可以使用sizeof計算類型的字節數大小  sizeof(signed long)
整型:signed      有符號signed char         1   -128~127signed short        2   -32768~32767signed int          4   正負20億signed long         4或8(由操作系統位數決定)signed long long    8   以9開頭19位數字的整數注意:signed不加就代表加unsigned    無符號unsigned char         1     0~255unsigned short        2     0~65535unsigned int          4     0~40億unsigned long         4或8(由操作系統位數決定)unsigned long long    8     1開頭的20位正整數注意:由于定義無符號的數據是比較麻煩,標準庫把這些無符號的類型重新定義成以下的類型:需要包含一個頭文件<stdint.h>uint8_t uint16_t  uint32_t  uint64_t浮點型:float           4double          8long double     12或者16(根據系統)注意:采用科學計數法存儲,二進制與真實的數據之間需要翻譯轉換,因此浮點型運算速度就比整型要慢,編程時盡量采用整型小數點后六位有效判斷float類型的數據是否是0float num;if(num 0 <= 0.000001 || num >= -0.000001)字符型:char 字符其實就是符號或者圖案,但是,在內存中存儲的是整數,需要顯示字符時,會根據ASCLL碼表中對應關系來顯示相應的符號或者圖案。0       ''      特殊字符,表示什么都沒有48      '0'65      'A'97      'a'
布爾型:由于先有了C語言后才有了bool類型,所以C語言不可能有真正的布爾類型,使用stdbool.h頭文件,該文件是對布爾類型做的模擬bool  true  false

七、變量與常量

什么是變量:程序運行期間數值可以發生改變的叫做變量,相當于存儲數據的盒子。
定義:  類型 變量名;int num;取名規則:1、只能是由字母、數字、下劃線組成2、不能以數字開頭3、不能與32個C關鍵字重名4、見名知意【功能、類型、作用域...】
使用:賦值:num = 100;參與運算:num*10;注意:C語言中變量的值默認是隨機的,為了安全起見,一般都初始化為0變量的輸入輸出:int printf (const char *format,...);功能:輸出數據format: "雙引號包含的格式信息(提示信息+占位符)"...: 要輸出的變量的列表返回值: 輸出的字符的個數int scanf(const char *format,...);功能:從鍵盤輸入數據foemat:"由雙引號包括的格式信息(占位符)"...:要接收的變量的列表返回值:成功輸入的變量個數注意:scanf需要的是變量的類型、變量的地址,變量的地址 = &變量名練習1:定義各種類型的變量并初始化,使用scanf輸入,使用printf顯示
#include<stdio.h>int main(int argc,const char* argv[])
{char num_c=0;short num_s=0;int num_i=0;long num_l=0;long long num_ll=0;unsigned char num_uc=0;unsigned short num_us=0;unsigned int num_ui=0;unsigned long num_ul=0;unsigned long long num_ull=0;float num_f=0;double num_d=0;long double num_ld=0;printf("請輸入num的值:");scanf("%hhd%hd%d%ld%lld",&num_c,&num_s,&num_i,&num_l,&num_ll);scanf("%hhu%hu%u%lu%llu",&num_uc,&num_us,&num_ui,&num_ul,&num_ull);scanf("%f%lf%LF",&num_f,&num_d,&num_ld);printf("char=%hhd,short=%hd,int=%d,long=%ld,longlong=%lld",num_c,num_s,num_i,num_l,num_ll);printf("uchar=%hhu,ushort=%hu,uint=%u,ulong=%lu,ulonglong=%llu",num_uc,num_us,num_ui,num_ul,num_ull);printf("float=%f,double=%lf,longdouble=%LF",num_f,num_d,num_ld);
}
類型占位符:C語言通過占位符來傳遞變量的類型 signed      %hhd %hd %d %ld %lldunsigned    %hhu %hu %u %lu %llu%f %lf %LF 什么是常量:程序運行期間數值絕對不能改變的叫常量字面值常量100 'a' "hello world"枚舉常量宏常量100 int(默認int)100l long100ll long long100u unsigned int100lu100llu3.14 默認double類型3.14f float

八、格式化輸入輸出

%nd  顯示n個字符寬度,如果不夠則補空格,右對齊
%-nd  顯示n個字符寬度,如果不夠則補空格,左對齊
%0nd  顯示n個字符寬度,如果不夠則補0,右對齊
%n.mf   顯示n個字符寬度,小數也算一位,不夠則補空格,m表示小數點后的位數(四舍五入)
%g    不顯示小數點后多余的0

九、運算符

自變運算符:前后++/--,使變量的值自動加1或者減1前自變  立即有效后自變  下一句語句生效注意:不要再一行語句中多次使用自變運算符算數運算符+ - * / %/ %  除數不能為0,會造成浮點數例外,核心已轉儲,程序直接死掉整數/整數   結果沒有小數部分關系運算符> < >= <= == !=比較的結果是0(假)或1(真),運算結果可以繼續參與運算 if(a>b==0)int num = 500;0<num<100;永遠為真邏輯運算符&& || !比較對象轉換為邏輯值,0轉換成假,非0轉換為真A && B 一假為假A || B 一真為真!A     求反&&、|| 具有短路特性:當左邊的表達式可以確定整個表達式的結果時,右邊不進行計算三目運算符運算對象有3個A?B:C   先判斷A的表達式真假,若為真執行B,假執行C注意:該語句不能使用流程控制語句,因為他必須要有運行結果賦值運算符= += -= *= /=num+=100  <=>  num=num+100位運算符& | ~ ^ >> <<后邊講

十、類型轉換

自動類型轉換:只有相同類型的數據才能進行運算,不同類型數據自動轉換成相同類型再進行計算:轉換規則(以不丟失數據為基礎,適當犧牲一些空間)1、字節少的向字節多的轉     考慮優先級2、有符號向無符號的轉3、整型向浮點型轉強制類型轉換:(想要轉成的類型)原數據;int num;(short)num;注意:有丟失數據風險,慎重使用

十一、分支語句

if(表達式)  //單分支
{表達式為真,執行此處代碼
}if(表達式)    //雙分支
{表達式為真,執行此處代碼
}
else
{表達式為假,執行此處代碼
}if(表達式1)   //多分枝
{表達式1為真,執行此處代碼
}
else if(表達式2) 
{表達式2為真,執行此處代碼
}
else if(表達式3)
{表達式3為真,執行此處代碼
}
else
{當表達式123都為假時執行此處代碼
}

作業

作業1:輸入三個整數(鍵盤),從大到小顯示。
#include<stdio.h>int main(int argc,const char* argv[])
{int a[3];int i,k,j;printf("請輸入三個整數");for(i=0;i<3;i++){scanf("%d",&a[i]);}for(i=0;i<3;i++){for(j=i+1;j<3;j++){if(a[i]<a[j]){	k=a[i];a[i]=a[j];a[j]=k;}		}}for(i=0;i<3;i++){printf("%d",a[i]);}return 0;	
}
作業2:輸入一個年份,判斷是否時閏年
#include<stdio.h>int main(int argc,const char* argv[])
{int year;printf("請輸入年份");scanf("%d",&year);if(year % 400 == 0){printf("是閏年");}else if(year % 4 == 0 && year % 100 != 0){printf("是閏年");		}else{printf("不是閏年");}}
作業3:輸入一個年份與月份,判斷該月多少天
#include<stdio.h>int main(int argc,const char* argv[])
{int year,mon;printf("請輸入年份");scanf("%d",&year);printf("請輸入月份");	scanf("%d",&mon);if(year % 400 != 0 && year % 4 != 0){if(mon==2){printf("該月28天");	}else if(mon==4 || mon==6 || mon==9 || mon==11){printf("該月30天");}else if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12){printf("該月31天");	}else{printf("輸入錯誤");	}}else{if(mon==2){printf("該月29天");	}else if(mon==4 || mon==6 || mon==9 || mon==11){printf("該月30天");}else if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12){printf("該月31天");	}else{printf("輸入錯誤");	}}return 0;
}
作業4:輸入一個三位整數,判斷是否是水仙花數
#include<stdio.h>int main(int argc,const char* argv[])
{int g,s,b;int num;printf("請輸入一個三位整數");scanf("%d",&num);b=num/100;s=num%100/10;g=num%10;if(num>=100 && num<=999){if(num==g*g*g+s*s*s+b*b*b){printf("是水仙花數");}else{printf("不是水仙花數");}}else{printf("請仔細審題");}return 0;
}
作業5:輸入一個成績,判斷該成績的等級
#include<stdio.h>int main(int argc,const char* argv[])
{int cj;printf("請輸入成績");scanf("%d",&cj);if(cj<0 || cj>100){printf("輸入錯誤");	}else{if(cj<=100 && cj>=90){printf("A");}		else if(cj<90 && cj>=80){printf("B");}		else if(cj<80 && cj>=70){printf("C");}		else if(cj<70 && cj>=60){printf("D");}		else if(cj<60 && cj>=0){printf("E");}		}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443466.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443466.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443466.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習筆記4-C語言-開關、循環、跳轉

一、開關語句 switch(n) //n可以是數值、表達式&#xff0c;運算結果必須是整型 {case val: //必須是常量&#xff0c;如果val等于n&#xff0c;則打開開關...;break; //關閉執行開關&#xff0c;switch中不能與continue配合使用//如果所有的case后面都有…

JQuery,ajax異步加載selectoption/option/select多選框:

摘要&#xff1a;最近項目中用到了jquery&#xff0c;ajax&#xff0c;由于很長時間沒用了&#xff0c;所以這次做花了很多時間&#xff0c;現在記錄一下&#xff0c;方便以后回憶&#xff1a; 一&#xff1a;js文件&#xff1a; <script type"text/javascript"&…

學習筆記5-C語言-數組

數組&#xff1a; 什么是數組&#xff1a; 相同類型變量的組合,是一種批量定義變量的方式 定義&#xff1a; 類型 數組名[數組變量數量]&#xff1b;int arr[5]; 使用&#xff1a;數組名[下標]&#xff1b;arr[0];數組下標從零開始&#xff0c;范圍&#xff1a;0~數量-1 遍歷…

學習筆記6-小項目-走迷宮、推箱子

獲取方向鍵的功能&#xff1a;使用getch.h頭文件中的getch函數 1、把windows中的getch.h頭文件放到共享文件夾中 2、終端輸入 cd /media/sf_GONGXIANG進入共享文件夾 3、sudo cp getch.h /usr/include 4、cd /usr/include/ 5、sudo chmod r getch.h頭文件中的getch函數 time.h…

學習筆記7-C語言-進制轉換、原返補、位運算、函數

進制轉換 為什么要使用二、八進制、十六進制&#xff1f;因為現在的CPU只能識別高低兩種電流&#xff0c;因此只能對二進制數據進行運算二進制數據雖然可以直接被cpu識別&#xff0c;但不方便人們書寫、記錄&#xff0c;所以把二進制數據轉換成八進制是為了方便記錄在文件中。…

學習筆記8-作業

作業1&#xff1a;實現一個函數&#xff0c;判斷一個整數是否是素數&#xff0c;調用該函數來顯示出100~10000之間的所有素數 #include<stdio.h> #include<stdbool.h> #include<math.h> bool is_sushu(int num) {for(int i2;i<sqrt(num);i){if(num%i0)re…

學習筆記9-C語言-傳參、類型限定符、遞歸

函數傳參&#xff1a; 1、形參變量屬于它所在的函數&#xff0c;出了該函數就不能使用 2、實參與形參之間都是以賦值的形式進行數據傳遞&#xff08;值傳遞&#xff09; 3、return 其實是把返回值數據放置到一個公共的區域&#xff08;函數和函數調用者&#xff09;&#xff0…

Oracle創建視圖實現獲取當前數據所在的頁數,這里以每頁2條數據分頁

摘要&#xff1a;Oracle創建視圖實現獲取當前數據所在的頁數&#xff0c;這里以每頁2條數據分頁&#xff0c;詳細請看&#xff1a; 一&#xff1a; DROP VIEW MIP.TB_CMS_FLGTINFO_D_VIEW;/* Formatted on 2014/12/4 8:35:36 (QP5 v5.115.810.9015) */ CREATE OR REPLACE FOR…

學習筆記10-C語言-小項目-五子棋

小項目&#xff1a; 需要的數據 1、定義棋盤的二維數組 2、定義變量用于記錄下棋的坐標 3、定義角色 黑棋 O 白棋 * 空位業務邏輯&#xff1a; 是否需要對數據初始化 for(;;) {1、清屏、顯示棋盤2、落子坐標是否合法、該位置是否有棋子3、判斷是否五子連珠4、交換角色5、顯示…

學習筆記11-C語言-指針

什么是指針&#xff1a; 指針是一種特護的數據類型&#xff0c;使用它可以定義指針變量&#xff0c;指針變量存儲的是整型數據&#xff0c;代表內存的編號&#xff0c;通過這個編號可以訪問到對應內存。為什么使用指針 1、函數與函數之間是相互獨立的&#xff0c;但是有些時候…

學習筆記12-C語言-堆內存、字符串

什么是堆內存&#xff1a; 是進程中的一個內存段&#xff08;text\data\bss\heap\stack&#xff09;&#xff0c;由程序猿手動控制。 特點是足夠大&#xff0c;缺點是使用麻煩為什么要使用堆內存&#xff1a; 1、隨著程序的復雜&#xff0c;數據會越來越多。 2、其他的內存段…

學習筆記13-C語言-字符串函數、緩沖區

字符串的常用函數: #include<string.h> size_t strlen(const char* s); 功能&#xff1a;計算字符串長度&#xff0c;但是結果不包括\0 返回值&#xff1a;返回字符串中字符的個數size_t str_len(const char* str) {assert(NULL ! str);const char* tmp str;while(*tmp…

Oracle數據庫里面查詢字符串類型的字段不為空和為空的SQL語句:

摘要&#xff1a;近期項目中&#xff0c;在做高級查詢的時候有個條件是根據選擇的字段&#xff0c;然后再選擇字段的值為空和不為空做查詢&#xff0c;在寫SQL語句的時候費了很長時間&#xff0c;現在記錄一下&#xff0c;方便日后查看&#xff1a; 一&#xff1a;查詢字符串類…

學習筆記14-C語言-小項目-通訊錄

通訊錄&#xff1a; 要求&#xff1a; 姓名&#xff0c;性別、電話&#xff0c;最多儲存50個聯系人 功能&#xff1a;1、添加聯系人2、按名字刪除聯系人3、按姓名修改聯系人信息4、查找聯系人&#xff0c;可通過電話&#xff0c;名字查找&#xff0c;支持模糊查找5、顯示所有聯…

學習筆記15-C語言-預處理指令、條件編譯、頭文件

預處理指令&#xff1a; 程序猿編寫的代碼不是標準C代碼&#xff0c;并不能被真正的編譯器索編譯&#xff0c;需要一段程序把代碼翻譯一下。 翻譯的過程叫做預處理&#xff0c;被翻譯的代碼叫做預處理指令&#xff0c;以#開頭的都是預處理指令查看預處理的過程&#xff1a;gcc…

學習筆記16-C語言-小項目-使用Makefile完成2048

Makefile: Makefile是一系列編譯指令組成的可執行文本&#xff0c;也叫做編譯腳本。 在終端執行make命令會自動執行Makefile腳本中的編譯命令&#xff0c; 而且它還可以根據文件的最后修改時間來判斷哪些文件是否需要重新編譯、哪些文件不需要重新編譯&#xff0c;從而大大提高…

學習筆記17-C語言-結構、聯合、枚舉

結構&#xff1a; struct 結構是由程序猿自己設計的一種數據類型&#xff0c;用于描述一個事務的各項數據&#xff0c;由若干個不同的基礎數據類型組成。設計結構&#xff1a;struct 結構體名{類型 成員名&#xff1b;...}&#xff1b;定義結構體變量struct 結構體名 變量名&a…

Maven 3.0.5 安裝和配置:

摘要&#xff1a;現在的Web項目越來越多的都用maven管理了&#xff0c;所以我也抽時間學習學習&#xff0c;為了趕上時代&#xff01; 一&#xff1a;首先到maven官網&#xff1a;http://maven.apache.org/&#xff0c;然后選擇相應的版本下載&#xff0c;我這里下載的是maven…

學習筆記18-C語言-文件

文件的分類&#xff1a; 文本文件&#xff1a; 存儲的是ASCII碼值的二進制 二進制文件&#xff1a; 存儲的是數據的補碼文件IO&#xff1a; FILE *fopen(const char *path, const char *mode); 功能&#xff1a;打開或者創建文件 path&#xff1a;文件的路徑 mode&#x…

使用INNER JOIN ON 多表關聯查詢,獲取指定用戶下指定權限的資源SQL:

摘要&#xff1a;最近在看一個開源框架&#xff0c;其中用戶&#xff0c;角色&#xff0c;資源&#xff0c;這塊我感覺比較重要&#xff0c;所以就自己也模仿著寫了下&#xff0c;其中在獲取指定用戶下的權限資源的時候遇到問題了&#xff0c;開始時&#xff0c;我首先想到的方…