1. 程式人生 > >變量,循環控制語句

變量,循環控制語句

main.c printf lob 虛擬 上進 類庫 argv 文件 每一個

一、程序執行的過程

1.預編譯:主要處理源代碼中的預處理指令,引入頭文件,去除註釋,處理所有的條件編譯指令,宏的替換,添加行號,保留所有的編譯器指令。

gcc -E main.c -o main.i

2.編譯:編譯過程所進行的是對預處理後的文件進行語法分析,詞法分析,語義分析,符號匯總,然後生成匯編代碼。

gcc –S main.i -o main.s

3.匯編:這裏的匯編所說的是一個過程,將匯編代碼轉成二進制文件,二進制文件就可以讓機器來讀取。每一條匯編語句都會產生一句機器語言。

gcc -c main.s -o main.o

4.鏈接:將目標文件、啟動代碼、庫文件鏈接成可執行文件的過程,這個文件可被加載或拷貝到存儲器執行。

連接處理可以分為兩種:

①靜態鏈接:(編譯時)

鏈接器將函數的代碼從其所在地(目標文件或靜態鏈接庫中)拷貝到最終的可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。

為創建可執行文件,鏈接器必須要完成的主要任務:

  1. 符號解析:把目標文件中符號的定義和引用聯系起來;
  2. 重定位:把符號定義和內存地址對應起來,然後修改所有對符號的引用。

②動態鏈接(加載運行時):在此種方式下,函數的定義在動態鏈接庫或共享對象的目標文件中。在編譯的鏈接階段,動態鏈接庫只提供符號表和其他少量信息用於保證所有符號引用都有定義,保證編譯順利通過。動態鏈接器(ld-linux.so)鏈接程序在運行過程中根據記錄的共享對象的符號定義來動態加載共享庫,然後完成重定位。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼

gcc -o main main.o

5.處理器讀取並解釋存儲在存儲器中的指令

Shell:命令行解釋器,為用戶提供了一只與系統打交道的方式。它等待用戶的輸入,當用戶輸入一行命令後,shell先判斷它是不是一個shell內置命令,如果不是,shell會假定用戶輸入為一個可執行文件的名字,從而去加載並執行該文件。因此,當我們通過編譯系統將源文件編譯成可執行二進制文件後,在shell中輸入我們得到的可執行二進制文件名,shell將其從磁盤中加載到存儲器(註:我們的可執行文件是存放在磁盤上的),並通過處理器進行解釋執行,得到最終的結果,輸出到終端(顯示器)上進行顯示。自此,我們的hello, world程序完成了其生命周期。

二、代碼規範

代碼規範:運算符前後要加空格,不同模塊之間要換行

三、變量

/*
#include 宏 導入頭文件
什麽情況下需要導入頭文件:需要用到外部提供的一些函數或者變量
導入的方式:
< > 導入系統自帶的庫 頭文件 告訴編譯器首先從系統類庫裏面去查找這個頭文件,如果類庫裏面沒有那麽從當前這個工程文件裏面查找
" " 導入自己寫的頭文件 告訴編譯器先從當前這個工程裏面去查找 如果沒有 那麽再去系統類庫裏面去查找
*/
#include <stdio.h>

/*
argc: 執行這個程序時 編譯器傳遞過來的參數個數
argv: 每一個參數的字符串組成的數組
IDE環境下 argc=1 argv=程序路徑

int main(int argc,char *argv[]){
printf("argc = %d\n", argc);

for (int i = 0; i < argc; i++){
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}

int 返回值:記錄程序執行的狀態
如果返回0 表示正常結束
如果返回-1 表示非正常結束 如果程序在執行過程中占有資源(內存資源 文件資源) 此時系統會沒收分配的資源

關鍵字:int const char return float double long exit
有特殊的含義 在定義變量的時候不能用關鍵字來當變量名
*/

int global = 0; //全局變量

int main(int argc, const char * argv[]) {

/*
1個字節 = 8位
變量 常量:程序在執行過程中有些數據或者資源需要被長時間記錄 就需要定義一個變量或者常量來保存它
整形數據 int 1 23 940
浮點型數據 float 78.5 125.4
字符數據 char ‘A‘ ‘B‘
長整型數據 long

定義一個變量:系統會立刻分配內存
聲明一個變量:不會立刻分配內存 當使用這個變量的時候才去分配內存
*/
int temp = 10;

float weight;
weight = 165.3;

printf("int size = %lu\n", sizeof(int));
printf("float size = %lu\n", sizeof(float));
printf("double size = %lu\n", sizeof(double));
printf("long size = %lu\n", sizeof(long));
printf("char size = %lu\n", sizeof(char));

printf("global = %d\n", global);

//變量的作用域
int a = 20;//局部變量 臨時變量
//int a = 340; 同一個變量在同一個代碼塊裏面不能被重復定義
{
global = 39;
//...
printf("a = %d %p\n", a, &a);
int a = 10; //臨時變量 局部變量
//...
//...
printf("a = %d %p\n", a, &a);
}
printf("a = %d\n", a);

//全局變量
//靜態變量
printf("global = %d\n", global);
return 0;
}

四、循環控制語句

//1 2 3 4
for (int i = 1; i <= 4; i++){
for (int j = 1; j <= 4; j++) {
for (int k = 1; k <= 4; k++) {
if (i != j && i != k && j != k){
printf("%d\n", i*100+j*10+k);
}
}
}
}

//break 直接結束當前這個循環
//continue 結束這一次循環 繼續下一次循環
for (int i = 0; i < 10; i++) {
if (i == 5){
//break;
continue;
}
printf("%d ", i);
}

for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 4; j++) {
//判斷i 和 j是否相同
if (i == j){
continue;
}
for (int k = 1; k <= 4; k++) {
if (i == k || j == k ) {
continue;
}

printf("%d\n", i*100 + j *10 + k);
}
}
}

變量,循環控制語句