天天看點

c語言基礎學習02_helloworld

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

涉及到的知識點有: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可以檢視的到。

c語言基礎學習02_helloworld

作業系統結構

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/chenmingjun

Copyright ©2018 黑澤明軍

【轉載文章務必保留出處和署名,謝謝!】