我嘗試用這博客記錄下我所熱愛
?我只不過是個無名小輩
?無休止地更新
?在名利中苦苦掙扎
?世事變幻莫測
?就算每一次早早被淘汰
?在失敗邊緣掙扎
我的數(shù)據(jù)結構與算法系列開始了,有一定C語言基礎的同學可以去學習!
數(shù)據(jù)結構與算法_時間復雜度
有任何問題都可以私信我。
目錄
變量的作用域和生命周期
變量的作用域
變量的生命周期
常量
字面常量const
const修飾的常變量
#define定義的標識符常量
枚舉常量
字符串+轉義字符
字符串
轉義字符
選擇語句
循環(huán)語句
什么是作用域?
舉個簡單的例子,當我執(zhí)行以下代碼時:
#includeint main()
{
{
int a = 100;
printf("%d", a);
}
return 0;
}
可以得到預期的結果:
而當我執(zhí)行下邊的代碼時:
#includeint main()
{
{
int a = 100;
}
printf("%d", a);
return 0;
}
會發(fā)現(xiàn)編譯器會報錯:
說明a在{}內(nèi)部可以使用,但出了{}就不能用了。
通俗地講,哪里可以使用它,哪里就是它的作用域。
現(xiàn)在定義一個全局變量,再定義一個函數(shù),看看兩個2022能不能都打印出來。
#includeint g_a = 2022;
void test()
{
printf("test:%d\n", g_a);
}
int main()
{
printf("%d\n", g_a);
test();
return 0;
}
經(jīng)調(diào)試發(fā)現(xiàn)得到了預期的結果。
過程如下:
如果我們執(zhí)行以下代碼:
#includevoid test()
{
printf("test:%d\n", g_a);
}
int g_a = 2022;
int main()
{
printf("%d\n", g_a);
test();
return 0;
}
會發(fā)現(xiàn)編譯器會報錯:
要解決問題,在開頭的時候聲明一下就好:
#includeint g_a;
void test()
{
printf("test:%d\n", g_a);
}
int g_a = 2022;
int main()
{
printf("%d\n", g_a);
test();
return 0;
}
真正定義在后邊,第一個只是聲明。
也可以直接在代碼開頭定義。
要使用變量,一定要先聲明再使用。
全局變量還可以這么用:
新建一個.c源文件,在里邊定義一個變量,能否在一個.c文件中調(diào)用另一個.c文件里的變量呢?
會發(fā)現(xiàn)編譯器會報錯:
這時候就要聲明外部符號了!
在test.c中加上extern int g_a;
#includeextern int a;
int main()
{
printf("%d\n", a);
return 0;
}
經(jīng)調(diào)試得到了預期的結果:
所以,全局變量的作用域是整個項目(工程)!
變量的生命周期什么是變量的生命周期?
變量的生命周期指的是變量的創(chuàng)建到變量的銷毀之間的一個時間段。
在之前我們演示過這樣的代碼的調(diào)用:
#includeint main()
{
{
int a = 100;
}
printf("%d", a);
return 0;
}
a并不能在printf中使用。
為什么不能?
就是因為局部變量在進入作用域時創(chuàng)建,一旦出了作用域就會銷毀。銷毀了就不能用了。
本質(zhì)上是在變量創(chuàng)建時向內(nèi)存申請一塊空間,銷毀時把這塊空間還給內(nèi)存。
局部變量的生命周期是:進入作用域生命周期開始,出作用域生命周期結束。
全局變量的生命周期是:整個程序的生命周期。
只要程序還活著,全局變量就可以使用。
常量會變的值是變量,恒不變的值是常量。
C語言中常量和變量的定義有所差異:
C語言中的常量分為以下以下幾種:
字面常量
const修飾的常變量
#define定義的標識符常量
枚舉常量
這些常量都有自己的特點,要根據(jù)需求去選擇。
字面常量const字面常量可以這樣定義:
int main()
{
100;
'a';
3.141592653589;
3.14;
"hello world";
return 0;
}
100是整型常量,a是字符型常量,3.141592653589是雙精度浮點型常量,3.14是單精度浮點型常量,hello world是字符串常量。都是字面常量。
const修飾的常變量為什么叫常變量?是因為它本質(zhì)上是變量,但是不能通過某種方式改變。
這里僅僅點到為止,想仔細了解可閱讀我先前的博客文章http://t.csdn.cn/PdCHE
比如我創(chuàng)建一個變量,在它前面加上const,然后想改變它的值,但發(fā)現(xiàn)編譯器會報錯:
#includeint main()
{
const int a = 0;
a = 100;
printf("%d",a);
return 0;
}
也就是說,它是變量,但有常量的部分屬性。
#define定義的標識符常量現(xiàn)在用#define給M定義100
#define M 100
這就是#define標識符常量的定義方法。
執(zhí)行以下代碼,會打印出100
#include#define M 100
int main()
{
printf("%d",M);
return 0;
}
枚舉常量枚舉其實就是一一列舉。
生活中有些值可以一一列舉,如血型、性別、三原色等等。
如果想定義三原色,就要用到enum
#includeenum COLOR
{
RED,
GREEN,
BLUE
};
int main()
{
return 0;
}
如果我想讓c代表的顏色為紅色,那就需要這樣:
enum COLOR c = RED;
RED、GREEN和BLUE有其相對應的值嗎?
執(zhí)行以下代碼:
#includeenum COLOR
{
RED,
GREEN,
BLUE
};
int main()
{
printf("%d\n",RED);
printf("%d\n", GREEN);
printf("%d\n", BLUE);
return 0;
}
可以發(fā)現(xiàn)它們的值分別是0、1、2。
更多常量相關的細節(jié)日后再講。
字符串+轉義字符 字符串“hello world.\n"
這種由雙引號引起來的一串字符稱為字符串字面值,或者簡稱字符串。
注意!字符串的結束標志是一個 \0 的轉義字符。
在計算字符串長度的時候\0是結束標志,不算作字符串內(nèi)容。
如果想存儲一個字符,就要用字符型變量。
如果想存儲多個字符或是字符串,就用到數(shù)組了。
比如,我想存儲hello world,可以這樣定義數(shù)組:
char arr[] = "hello world";
注意,用字符串就要用字符型變量char。
也可以這樣:
char arr[] = { 'h','e','l','l','l','o',' ','w','o','r','l','d','\0' };
這樣存儲字符串時,一定要以\0結尾?。?!
如果去掉\0再去執(zhí)行代碼:
#includeint main()
{
char arr[] = { 'h','e','l','l','l','o',' ','w','o','r','l','d'};
printf("%s", arr);
return 0;
}
會出現(xiàn)“燙”的字樣。
是內(nèi)存太燙了嗎?......
為什么會出現(xiàn)這種情況?
調(diào)試以下代碼,對arr1和arr2進行監(jiān)視:
#includeint main()
{
char arr1[] = { 'h','e','l','l','l','o',' ','w','o','r','l','d'};
char arr2[] = "hello world";
gets();//無實際意義,僅用于不讓程序結束。
return 0;
}
可以發(fā)現(xiàn)arr2比arr1多了\0。
arr2中的\0是隱藏的、自動補上的,我們看不到但它是實際存在的。而arr1中沒有\(zhòng)0。
這是兩種不同書寫形式帶來的差異。
上文已提到\0是字符串結束的標志。
%s是打印字符串。
在初始化arr1和arr2時會向內(nèi)存分別申請一塊空間,分別存放hello world和hello world\0。
在打印字符串的時候,一直要打印到\0才停止。
由于arr1中沒有\(zhòng)0,那么將繼續(xù)往后打印,與arr1相鄰的內(nèi)存空間中存放的是什么完全不知道,直至遇到\0為止。
所以就會看到亂碼的現(xiàn)象。
如果不想出現(xiàn)亂碼,就要在arr1末尾手動加上\0
另外,計算字符串長度時,\0不算作字符串內(nèi)容。
比如用常用庫函數(shù)strlen(需要引用string.h頭文件):
#include#includeint main()
{
int length = 0;
char arr[] = "hello world";
length = strlen(arr);
printf("%d", length);
return 0;
}
strlen統(tǒng)計的是\0之前的字符串的個數(shù)。
轉義字符在屏幕上打印abcndef
printf("abcndef");
而當我在n之前加上\的時候:
printf("abc\ndef");
此時\n是轉義字符換行符,不再是字符n。
假如我們要在屏幕上打印一個目錄: c:\code\test.c
printf("c:\code\test.c\n");
實際上運行效果是這樣的
這是因為t前邊由于\的存在,t被轉義了。
下邊看一些轉義字符:
看一道筆試題:
int main()
{
printf("%d\n", strlen("abcdef"));
printf("%d\n", strlen("c:\test\628\test.c"));
return 0;
}
程序會輸出什么?
是6和14。
第一行打印很簡單,第二行稍復雜。
首先\t會成為轉義字符,那么接下來是\6成為轉義字符?還是\62成為轉義字符?還是\628成為轉義字符?
是\62,因為根據(jù)上表,\ddd中ddd表示1~3個八進制的數(shù)字。
既然是八進制,那8就不能參與成為轉義字符的一部分了。
為什么不是\6?因為三位之內(nèi)的八進制數(shù)都可以成為轉義字符的一部分。
還有就是,轉義字符不管看起來長多少,都是一個字符的長度。
選擇語句如果你好好學習,校招的時候拿一個好offer,走上人生巔峰。
如果你不學習,畢業(yè)即失業(yè),回家賣紅薯!
這就是選擇。
如果用C語言表達,是這樣的:
#includeint main()
{
int input = 0;
printf("你要好好學習嗎?(1/0)\n");
scanf("%d",&input);
if (input == 1)
{
printf("好offer");
}
else if (input == 0)
{
printf("賣紅薯");
}
else
{
printf("輸入錯誤!");
}
return 0;
}
要么打印輸出“好offer”,要么打印輸出“賣紅薯”,要么打印輸出“輸入錯誤!”,不可能兩個或者三個同時執(zhí)行。
C語言中if語句就是選擇語句。
循環(huán)語句生活中有很多事情需要我們?nèi)諒鸵蝗丈踔聊陱鸵荒甑厝プ?,比如上課、學習。
你一直在學計算機,天天買彩票。
某天你買了張彩票,中了大獎,那你走上了人生巔峰(相對的,因為可能會有人看不上這獎)。
然后就迎娶白富美,學習?學什么習!
如果你天天買彩票都沒中獎,你還會去老實學習,雖然是菜鳥,但是在堅持日復一日地學習。
直到有一天,你成為了大牛,你沒有買彩票中獎,同樣走上了人生巔峰。
C語言中有三種循環(huán),分別是while語句、for語句和do...while語句。
今天只講while語句,其他兩個后期講。
你選擇了好好學習,然后日復一日地敲代碼。
只有在敲夠20000行代碼(有意義的代碼)后才能拿到好offer。
如果你沒有敲夠20000行,就日復一日地敲代碼。
某天你敲夠了20000行代碼,恭喜!你拿到了好offer!
#includeint main()
{
printf("加入比特\n");
int line = 0;
while (line<= 20000)
{
line++;
printf("我要繼續(xù)努力敲代碼\n");
}
if (line >20000)
printf("好offer\n");
return 0;
}
如果你在學習過程中開始擺爛,沒有敲夠20000行代碼,那就沒有好offer了。
一定要滿足line>20000的條件,否則會提示“好好學習,天天編程”。
#includeint main()
{
printf("加入比特\n");
int line = 0;
while (line<= 20000)
{
line++;
printf("我要繼續(xù)努力敲代碼\n");
}
if (line >20000)
printf("好offer\n");
else
printf("好好學習,天天編程");
return 0;
}
創(chuàng)作不易,碼了五千多字,求各位老鐵三連支持下!
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧