涉及到的知識點有: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++進階之路 - 專題 - 簡書