1. 程式人生 > >2、c語言基礎學習02

2、c語言基礎學習02

操作系統 一個 常用快捷鍵 risc u+ 可執行 上傳 二進制位 寫法

=============================================================================
將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語言庫函數,功能是:向標準輸出設備輸出一個字符串
(註意:標準輸出設備不僅僅指的是屏幕,還有打印機等等什麽的)
可以通過命令 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
(註意:-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
編譯cc1.c,編譯之後得到的文件名字叫cc1.o
編譯的功能是:把文本的c語言編譯為二進制指令。
-----------------------------------------------------------------------------
鏈接的命令:
gcc -o c1 cc1.o (註意: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位
1111 1111
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語言以分號結尾的,而不是以行結尾的。
=============================================================================

2、c語言基礎學習02