C語言基礎的不能再基礎的程序知識!“hello world”!

涉及到的知識點有:include有兩種用法、{}大括號用法解釋、C語言自定義名字的要求、

c語言庫函數(shù)printf的解釋、編譯錯誤有兩種、調(diào)用system函數(shù)、c語言編譯過程、

操作系統(tǒng)結(jié)構(gòu)、指令集中的cpu架構(gòu) 、QT常用快捷鍵、vs常用快捷鍵

=============================================================================

將windows的可執(zhí)行文件上傳到linux,看能夠執(zhí)行嗎?

sftp> put a.exe

出現(xiàn)下面錯誤:沒有權(quán)限;拒絕訪問

-bash: ./a.exe: Permission denied

那我們提升下a.exe的權(quán)限試試

chmod u+x a.exe?

則出現(xiàn)下面錯誤:不能執(zhí)行二進制文件:執(zhí)行格式錯誤

-bash: ./a.exe: cannot execute binary file: Exec format error

說明windows的可執(zhí)行文件不能再linux系統(tǒng)下執(zhí)行

fatal error   致命錯誤

=============================================================================

#include的意思是頭文件包含,使用c語言庫函數(shù)需要提前包含所用到的庫函數(shù)對應的頭文件

c語言中如果要用到printf函數(shù),在使用前必須 #include

-----------------------------------------------------------------------------

include有兩種用法:

1、#include <文件名>    說明需要包含的文件在系統(tǒng)目錄下

2、#include “文件名”   ? 說明需要包含的文件在當前目錄下

-----------------------------------------------------------------------------

可執(zhí)行代碼必須放在{}大括號里面

; 在c語言中一行只寫一個分號是可以的,表示是空語句。

c語言中一組大括號里也可以再有多組大括號。

-----------------------------------------------------------------------------

int a;    //定義一個變量。

extern int b; ?//聲明一個變量。

-----------------------------------------------------------------------------

C語言自定義名字的要求:

可以使用大小寫字母、下劃線、數(shù)字,但第一個字母必須是字母或者下劃線。

且字母區(qū)分大小寫。(注意:BASIC語言不區(qū)分大小寫)

-----------------------------------------------------------------------------

printf 是c語言庫函數(shù),功能是:向標準輸出設備輸出一個字符串

(注意:標準輸出設備不僅僅指的是控制臺、屏幕,還有打印機等等什么的。)

printf 函數(shù)只能用在控制臺程序里面(就是字符界面下的),不能用在圖形界面下,即不能把一個字符串輸出到窗口里面。

可以通過命令 man 3 printf 來查看。

-----------------------------------------------------------------------------

編譯錯誤有兩種

warning ? 不影響編譯,只是警告。

error ? ? ? 編譯器徹底罷工了,不干活了。

-----------------------------------------------------------------------------

第一種寫法:

int main()

{

return 0;

}

第二種寫法:

void main()

{

return ;//或者可以這句話不用寫

}

對c語言,兩種寫法都對,但對于C++來講,只支持第一種寫法。

-----------------------------------------------------------------------------

在main函數(shù)中

return 0;   代表程序執(zhí)行成功,

return -1;  代表程序執(zhí)行失敗。

-----------------------------------------------------------------------------

c語言文件的擴展名是.c,C++文件的擴展名就是cpp

linux系統(tǒng)并不用后綴名來區(qū)分文件;

Linux不像Windows一樣區(qū)分文件后綴的,所以是可以改的,而且不影響使用的。

1,mv可以移動文件,也可以用作更改文件名。

2,修改命名:mv fileName.type fileName.newType就可以更改文件后綴了。

3,但是一些特定的文件不要隨意更改,例如配置文件。

=============================================================================

在使用system之前需要包含stdlib.h這個頭文件,

調(diào)用system函數(shù),可以在c語言的代碼中執(zhí)行另外一個程序

-----------------------------------------------------------------------------

如果在命令行執(zhí)行一個程序,那么這個程序的調(diào)用者就是操作系統(tǒng);

如果在代碼中通過system,執(zhí)行一個程序,那么這個程序的調(diào)用者就是自己寫的代碼本身。

c語言所有的庫函數(shù)調(diào)用,只能保證語法是一致的,但不能保證執(zhí)行結(jié)果是一致的,

同樣的,庫函數(shù)在不同的操作系統(tǒng)下執(zhí)行結(jié)果可能是一樣的,也可能是不一樣的。

不同平臺下的c語言的庫函數(shù)只能保證調(diào)用語法一樣,但不能保證執(zhí)行結(jié)果也是一樣的。

(因為c語言對硬件的要求、對操作系統(tǒng)的要求太多啦?。?/p>

所以用C語言在不同的平臺寫代碼的時候,可能會有一些移植的工作量。

-----------------------------------------------------------------------------

POSIX是一個標準,只要符合這個標準的函數(shù),在不同的系統(tǒng)下執(zhí)行的結(jié)果就可以一致。

如果有符合posix標準的函數(shù),盡量使用。

Unix和Linux很多庫函數(shù)都是支持POSIX的,但windows支持的比較差。(曾經(jīng)微軟說過要表示大力支持,但說得多做得少!)

所以說,如果將Unix代碼移植到Linux一般代價很小,如果把windows代碼移植到Unix或者linux就比較麻煩。

-----------------------------------------------------------------------------

system 返回的是一個整數(shù)。

即system的返回值就是所被調(diào)用程序中main函數(shù)的return的值。

=============================================================================

c語言編譯過程

1、預編譯 --> 2、編譯 --> 3、鏈接

-----------------------------------------------------------------------------

預編譯命令:

gcc -o cc1.c c1.c -E或者gcc -o cc1.c -E c1.c 或者 gcc -E c1.c -o cc1.c

(注意:-o 作用是指定輸出文件的名字,如果不加-o的話,則生成的文件名字總叫a.out)

預編譯c1.c,預編譯之后得到的文件的名字叫cc1.c。

(注意:編譯后的名字可以隨意起,但是呢我們知道預編譯后的文件還是文本的.c文件,所以為了好區(qū)分起名字為 xxx.c)

在c語言中#開頭的語句又叫預編譯指令。

#include

預編譯的功能之一:會把include包含的頭文件內(nèi)容做一個簡單的替換,即替換到.c文件里面去。

......

//此處省略1萬行

......

預編譯的功能之二:會把代碼中的注釋去掉。

-----------------------------------------------------------------------------

編譯的命令:

gcc -o cc1.o cc1.c -c或者gcc -o cc1.o -c cc1.c 或者?gcc -c cc1.c -o cc1.o

編譯cc1.c,編譯之后得到的文件名字叫cc1.o.

編譯的功能是:把文本的c語言編譯為二進制指令。

-----------------------------------------------------------------------------

鏈接的命令:

gcc -o c1 cc1.o ?或者 gcc cc1.o -o c1(注意:gcc沒有單獨的鏈接參數(shù))

將系統(tǒng)庫函數(shù)與cc1.o進行鏈接(簡言之合并),得到可執(zhí)行的程序,該程序的名字叫c1。

我們想知道在linux系統(tǒng)下到底鏈接來了什么庫來呢?(即可執(zhí)行程序需要用到什么庫呢?)

使用命令 ldd c1 查看。

(注意;用c語言寫的代碼依賴的庫最少,如果使用其他語言依賴的庫更多哦??!需要裝好多包包。)

那么在windows系統(tǒng)下的可執(zhí)行程序需要用到什么庫呢?

使用一個小軟件Depends.exe可以查看的到。

=============================================================================

操作系統(tǒng)結(jié)構(gòu)

1、用戶模式

我們目前寫的程序都是在用戶模式下運行的。

2、內(nèi)核模式

操作系統(tǒng)本身、設備驅(qū)動等這些軟件是在內(nèi)核模式下運行的。

-----------------------------------------------------------------------------

一個CPU的一個寄存器可以放8個二進制位。

例如:

0000 0000

1111 1111

則這個CPU就是8位的CPU。

-----------------------------------------------------------------------------

一個CPU的一個寄存器可以放16個二進制位。

0000 ?0000 ?0000 ?0000

1111 ? 1111 ? 1111 ?1111

則這個CPU就是16位CPU。

-----------------------------------------------------------------------------

總線有三種:數(shù)據(jù)總線、地址總線、控制總線。

總線在大多數(shù)時候和CPU的寄存器位數(shù)是相同的。

8位CPU的總線是8位。

1111 1111

f   f

256BYTE(255字節(jié))

16位CPU的總線是16位。

1111 1111 1111 1111

f  f  f  f

65536BYTE(64k字節(jié))

32位CPU的總線是32位。

1111 1111 1111 1111 1111 1111 1111 1111

f  f   f  f  f  f  f  f

32位CPU管理內(nèi)存有一個最大值,4G字節(jié) = 4 x 1024M = 4 x 1024 x 1024 x 1024Byte(字節(jié))。

64位CPU的總線是64位。

1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111

f   f ? ?f  f  ?f  ? f  ??f  ?? f  ? f  ? f  ? ?f  ??f  ??f  f  ??f  f

理論上64位CPU管理內(nèi)存是:2^64個字節(jié),但同時又取決于綜合的指標:比如主板、操作系統(tǒng)的支持等等。

但至少是遠遠大于4G的。

如果寄存器是64位,但總線是32位,這種cpu叫準64位CPU。

(即里面可以做到很寬,但是外面的工藝卻達不到)

若在64位的CPU架構(gòu)上運行了64位的軟件操作系統(tǒng),那么這個系統(tǒng)是64位的;

若在64位的CPU架構(gòu)上運行了32位的軟件操作系統(tǒng),那么這個系統(tǒng)是32位的。

-----------------------------------------------------------------------------

指令集中的cpu架構(gòu)?

精簡指令集RISC(服務器端用的)比如:SPARC、ARM屬于精簡指令集。

復雜指令集CISC(比如Inter的CPU)比如:X86屬于典型的復雜指令集。

-----------------------------------------------------------------------------

cpu內(nèi)部里面所有的計算都得在寄存器里面來完成。

cpu內(nèi)部的寄存器還有名字哦:

8位cpu(x86構(gòu)架)  16位CPU  32位CPU  64位CPU

a          ax,al,ah   ? eax   ? ?rax

b          bx,bl,bh   ? ? ebx ? ? ? ? ? ? ? rbx

c          cx      ? ?ecx ? ? ? ? ? ? ? rcx

d          ? dx       edx    rdx

-----------------------------------------------------------------------------

使用Qt時,再用到system函數(shù)時,會出現(xiàn)一個控制臺的窗口。

為什么呢?

答:因為system函數(shù)在windows系統(tǒng)下就是一個基于控制臺的函數(shù)(就是字符界面的函數(shù)),所以即使在圖形界面下調(diào)用system也會出現(xiàn)一個控制臺窗口。

那么如何在圖形界面下調(diào)用該函數(shù)又不顯示控制臺呢?

答:可以換另外一個函數(shù)啊!該函數(shù)是 WinExec("notepad",SW_NORMAL); 但是該函數(shù)需要包含一個頭文件是 #include 。

QT常用快捷鍵

Ctrl + I  ? ? ?自動格式化代碼

Ctrl + /   ?注釋代碼/取消注釋代碼

Ctrl + r   不調(diào)試運行代碼

Ctrl + b   編譯代碼但不運行代碼

Alt + enter ? ?自動完成類函數(shù)定義

F9   ? ? ? ?設置斷點

F5     調(diào)試運行

F10    ? next調(diào)試

F11   ? ?step調(diào)試

-----------------------------------------------------------------------------

vs常用快捷鍵

Ctrl + F5 ? ? ?   ? ? 不調(diào)試運行代碼

Ctrl + k,Ctrl + f ? ? ?自動格式化代碼

Ctrl + k,Ctrl + c ? ? 注釋代碼

Ctrl + k,Ctrl + u ? ? 取消注釋代碼

Ctrl + Shift + b ? ? ? ?編譯,不運行代碼

F5       ??調(diào)試運行

F9 ? ? ? ? ? ? ? ? ?   設置斷點

注意:C語言以分號結(jié)尾的,而不是以行結(jié)尾的。

=============================================================================

“我是一名從事了10年開發(fā)的老程序員,最近我花了一些時間整理關于C語言、C++,自己有做的材料的整合,一個完整的學習C語言、C++的路線,學習材料和工具。C/C++、編程愛好者的聚集地就在我這里 <進入我的專欄即可看到及領取>!歡迎初學和進階中的小伙伴。希望你也能憑自己的努力,成為下一個優(yōu)秀的程序員。工作需要、感興趣、為了入行、轉(zhuǎn)行需要學習C/C++的伙伴可以跟我一起學習!”

關注我的專欄,帶你遨游代碼世界!C語言/C++進階之路 - 專題 - 簡書

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容