=============================================================================
涉及到的知識點有:include有兩種用法、{}大括号用法解釋、C語言自定義名字的要求、
c語言庫函數printf的解釋、編譯錯誤有兩種、調用system函數、c語言編譯過程、
作業系統結構、指令集中的cpu架構 、QT常用快捷鍵、vs常用快捷鍵
将windows的可執行檔案上傳到linux,看能夠執行嗎?
sftp> put a.exe
出現下面錯誤:沒有權限;拒絕通路
-bash: ./a.exe: Permission denied
那我們提升下a.exe的權限試試
chmod u+x a.exe
則出現下面錯誤:不能執行二進制檔案:執行格式錯誤
-bash: ./a.exe: cannot execute binary file: Exec format error
說明windows的可執行檔案不能再linux系統下執行
fatal error 緻命錯誤
#include的意思是頭檔案包含,使用c語言庫函數需要提前包含所用到的庫函數對應的頭檔案
c語言中如果要用到printf函數,在使用前必須 #include <stdio.h>
-----------------------------------------------------------------------------
include有兩種用法:
1、#include <檔案名> 說明需要包含的檔案在系統目錄下
2、#include “檔案名” 說明需要包含的檔案在目前目錄下
可執行代碼必須放在{}大括号裡面
; 在c語言中一行隻寫一個分号是可以的,表示是空語句。
c語言中一組大括号裡也可以再有多組大括号。
int a; //定義一個變量。
extern int b; //聲明一個變量。
C語言自定義名字的要求:
可以使用大小寫字母、下劃線、數字,但第一個字母必須是字母或者下劃線。
且字母區分大小寫。(注意:BASIC語言不區分大小寫)
printf 是c語言庫函數,功能是:向标準輸出裝置輸出一個字元串
(注意:标準輸出裝置不僅僅指的是控制台、螢幕,還有列印機等等什麼的。)
printf 函數隻能用在控制台程式裡面(就是字元界面下的),不能用在圖形界面下,即不能把一個字元串輸出到視窗裡面。
可以通過指令 man 3 printf 來檢視。
編譯錯誤有兩種
warning 不影響編譯,隻是警告。
error 編譯器徹底罷工了,不幹活了。
第一種寫法:
int main()
{
return 0;
}
第二種寫法:
void main()
return ; //或者可以這句話不用寫
對c語言,兩種寫法都對,但對于C++來講,隻支援第一種寫法。
在main函數中
return 0; 代表程式執行成功,
return -1; 代表程式執行失敗。
c語言檔案的擴充名是.c,C++檔案的擴充名就是cpp
linux系統并不用字尾名來區分檔案;
Linux不像Windows一樣區分檔案字尾的,是以是可以改的,而且不影響使用的。
1,mv可以移動檔案,也可以用作更改檔案名。
2,修改命名:mv fileName.type fileName.newType就可以更改檔案字尾了。
3,但是一些特定的檔案不要随意更改,例如配置檔案。
在使用system之前需要包含stdlib.h這個頭檔案,
調用system函數,可以在c語言的代碼中執行另外一個程式
如果在指令行執行一個程式,那麼這個程式的調用者就是作業系統;
如果在代碼中通過system,執行一個程式,那麼這個程式的調用者就是自己寫的代碼本身。
c語言所有的庫函數調用,隻能保證文法是一緻的,但不能保證執行結果是一緻的,
同樣的,庫函數在不同的作業系統下執行結果可能是一樣的,也可能是不一樣的。
不同平台下的c語言的庫函數隻能保證調用文法一樣,但不能保證執行結果也是一樣的。
(因為c語言對硬體的要求、對作業系統的要求太多啦!)
是以用C語言在不同的平台寫代碼的時候,可能會有一些移植的工作量。
POSIX是一個标準,隻要符合這個标準的函數,在不同的系統下執行的結果就可以一緻。
如果有符合posix标準的函數,盡量使用。
Unix和Linux很多庫函數都是支援POSIX的,但windows支援的比較差。(曾經微軟說過要表示大力支援,但說得多做得少!)
是以說,如果将Unix代碼移植到Linux一般代價很小,如果把windows代碼移植到Unix或者linux就比較麻煩。
system 傳回的是一個整數。
即system的傳回值就是所被調用程式中main函數的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檔案,是以為了好區分起名字為 xxx.c)
在c語言中#開頭的語句又叫預編譯指令。
#include <stdio.h>
預編譯的功能之一:會把include包含的頭檔案内容做一個簡單的替換,即替換到.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沒有單獨的連結參數)
将系統庫函數與cc1.o進行連結(簡言之合并),得到可執行的程式,該程式的名字叫c1。
我們想知道在linux系統下到底連結來了什麼庫來呢?(即可執行程式需要用到什麼庫呢?)
使用指令 ldd c1 檢視。
(注意;用c語言寫的代碼依賴的庫最少,如果使用其他語言依賴的庫更多哦!!需要裝好多包包。)
那麼在windows系統下的可執行程式需要用到什麼庫呢?
使用一個小軟體Depends.exe可以檢視的到。

作業系統結構
1、使用者模式
我們目前寫的程式都是在使用者模式下運作的。
2、核心模式
作業系統本身、裝置驅動等這些軟體是在核心模式下運作的。
一個CPU的一個寄存器可以放8個二進制位。
例如:
0000 0000
1111 1111
則這個CPU就是8位的CPU。
一個CPU的一個寄存器可以放16個二進制位。
0000 0000 0000 0000
1111 1111 1111 1111
則這個CPU就是16位CPU。
總線有三種:資料總線、位址總線、控制總線。
總線在大多數時候和CPU的寄存器位數是相同的。
8位CPU的總線是8位。
f f
256BYTE(255位元組)
16位CPU的總線是16位。
1111 1111 1111 1111
f f f f
65536BYTE(64k位元組)
32位CPU的總線是32位。
1111 1111 1111 1111 1111 1111 1111 1111
f f f f f f f f
32位CPU管理記憶體有一個最大值,4G位元組 = 4 x 1024M = 4 x 1024 x 1024 x 1024Byte(位元組)。
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管理記憶體是:2^64個位元組,但同時又取決于綜合的名額:比如主機闆、作業系統的支援等等。
但至少是遠遠大于4G的。
如果寄存器是64位,但總線是32位,這種cpu叫準64位CPU。
(即裡面可以做到很寬,但是外面的工藝卻達不到)
若在64位的CPU架構上運作了64位的軟體作業系統,那麼這個系統是64位的;
若在64位的CPU架構上運作了32位的軟體作業系統,那麼這個系統是32位的。
指令集中的cpu架構
精簡指令集RISC(伺服器端用的)比如:SPARC、ARM屬于精簡指令集。
複雜指令集CISC(比如Inter的CPU)比如:X86屬于典型的複雜指令集。
cpu内部裡面所有的計算都得在寄存器裡面來完成。
cpu内部的寄存器還有名字哦:
8位cpu(x86構架) 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函數時,會出現一個控制台的視窗。
為什麼呢?
答:因為system函數在windows系統下就是一個基于控制台的函數(就是字元界面的函數),是以即使在圖形界面下調用system也會出現一個控制台視窗。
那麼如何在圖形界面下調用該函數又不顯示控制台呢?
答:可以換另外一個函數啊!該函數是 WinExec("notepad",SW_NORMAL); 但是該函數需要包含一個頭檔案是 #include <windows.h>。
QT常用快捷鍵
Ctrl + I 自動格式化代碼
Ctrl + / 注釋代碼/取消注釋代碼
Ctrl + r 不調試運作代碼
Ctrl + b 編譯代碼但不運作代碼
Alt + enter 自動完成類函數定義
F9 設定斷點
F5 調試運作
F10 next調試
F11 step調試
vs常用快捷鍵
Ctrl + F5 不調試運作代碼
Ctrl + k,Ctrl + f 自動格式化代碼
Ctrl + k,Ctrl + c 注釋代碼
Ctrl + k,Ctrl + u 取消注釋代碼
Ctrl + Shift + b 編譯,不運作代碼
F5 調試運作
F9 設定斷點
注意:C語言以分号結尾的,而不是以行結尾的。
我的GitHub位址:
https://github.com/heizemingjun我的部落格園位址:
http://www.cnblogs.com/chenmingjun我的螞蟻筆記部落格位址:
http://blog.leanote.com/chenmingjunCopyright ©2018 黑澤明軍
【轉載文章務必保留出處和署名,謝謝!】