目錄
一、變數的使用
二、變數的作用域和生命周期
三、常量的進一步了解
四、字串
五、轉義字符
六、注釋
七、總結
一、變數的使用
1、 在敘述變數的使用之前先說一個C語言中的輸入函式 scanf
(1)scanf 函式是C語言提供的一個輸入函式
scanf 函式的使用格式:
這里使用輸入整數舉例說明
- 如果要輸入兩個整數,雙引號中就要寫兩個%d, 輸入n個整數就寫n個%d
- %d與%d之間可以用空格隔開,也可以用逗號隔開
- 用空格隔開:scanf("%d %d",&num1,&num2);
- 用逗號隔開:scanf("%d,%d",&num1,&num2);
- & --->取地址,使用scanf函式輸入資料時要在變數前加取地址符&
- 雙引號引起來的內容[ "%d,%d" ]叫做格式控制符,在定義時使用什么格式,那么在輸入資料的時候就要使用該格式來輸入資料,
- 例如:
- %d與%d之間使用空格隔開,那么在控制臺中輸入的兩個資料之間也要用空格隔開;
- %d與%d之間使用逗號隔開,那么在控制臺中輸入的兩個資料之間也要用逗號隔開;
(2)簡單說明一下在VS這個集成開發環境中使用scanf函式報錯的問題

如果在VS中使用scanf函式出現報錯,在給出的報錯資訊中有兩種解決方法:
VS中使用scanf函式的報錯資訊:
'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
方法一:在源檔案的第一行加上 #define _CRT_SECURE_NO_WARNINGS 1
#define 后面的內容就顯示在報錯的資訊中,可以直接在報錯的資訊中復制這段文字,后面的1是隨便寫的一個值,加不加都不影響使用,(建議盡量去復制 _CRT_SECURE_NO_WARNINGS這段文字,自己用鍵盤打出來有可能會出錯)
注意:#define _CRT_SECURE_NO_WARNINGS 1 這句一定要放在代碼的第一行,放在其他位置就不起作用了,
補充:每次寫代碼的時候都要加 #define _CRT_SECURE_NO_WARNINGS 1 可能會比較麻煩,可以在電腦中搜索newc++file.cpp這個檔案(這個檔案是在你安裝的VS的的路徑下),搜索到這個檔案以后,將這個檔案拖到桌面中(檔案原路徑下不可以編輯修改)再進行編輯將#define _CRT_SECURE_NO_WARNINGS 1 這句話放到這個檔案中然后保存(也可以將經常用到的頭檔案保存在這個檔案中),保存完以后再將這個檔案拖回到原來的路徑下,這樣每次在VS中寫代碼的時候第一行都會默認加上這句話,
【因為此文章是講述C語言的知識點,VS的操作內容不會詳細講述,這里只是進行了一些文字描述,如果有不清楚的地方可以百度查看一下詳細的操作,也可以私信我,】
方法二:在報錯的資訊中提到可以使用scanf_s 來代替scanf函式(不推薦使用這種方法)
scanf_s函式是vs編譯器提供的一種函式,不是C語言自己的,在其他的編譯器(gcc,clang......)下沒有scanf_s函式,其他編譯器也不認識這個函式,當你在代碼中使用了scanf_s函式,你的代碼在其他編譯器下就沒法正確的編譯,這樣就降低了代碼的跨平臺性,所以建議寫代碼時使用標準C提供的功能和函式,
如果好奇想使用scanf_s這個函式,一定要研究清楚它的使用方法再去使用,它的使用方法與scanf函式是有區別的,這里就不再過多的敘述,
2、變數的使用:需要變數就創建一個變數然后使用這個變數就可以了,
這里給出兩整數相加的例子:
//stdio.h 標準輸入輸出頭檔案
#include<stdio.h>
//scanf 是C語言提供的一個輸入函式
//& --->取地址
int main()
{
//兩個整數相加
int num1 = 0;
int num2 = 0;
int sum = 0;
//輸入兩個值
scanf("%d %d", &num1, &num2);
//計算
sum = num1 + num2;
//輸出
printf("%d\n", sum);
return 0;
}
運行結果:

也可以將sum在定義的時候直接使用:
#include<stdio.h>
int main()
{
//兩個整數相加
int num1 = 0;
int num2 = 0;
//輸入兩個值
scanf("%d %d", &num1, &num2);
//計算
int sum = num1 + num2;
//輸出
printf("%d\n", sum);
return 0;
}這種寫法在老一點的編譯器中編譯會報錯,
C99標準之前有一個規定:變數要創建在當前代碼塊的最前面!
C99之后的語法中就支持了:變數在哪里使用就在哪里定義!
二、變數的作用域和生命周期
1、作用域:
作用域是程式設計概念,通常來說,一段程式代碼中所用到的名字并不總是有效、可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域,
- 區域變數的作用域是變數所在的區域范圍,

如果去點47行的代碼,就可以輸出變數b的值

區域變數a的作用域是在外面的 { } 內

- 全域變數的作用域是整個工程,

2、生命周期:
變數的生命周期指的是變數的創建到變數的銷毀之間的一個時間段
- 區域變數的生命周期是:進入作用域生命周期開始,出作用域生命周期結束,
- 全域變數的生命周期是:整個程式的生命周期,
作用域描述的是變數的使用范圍,生命周期描述的是一個時間段,
作用域與生命周期是兩個不同的概念,二者只是有關聯,
我在另一篇文章中也講述了生命周期與全域變數,有興趣的老鐵可以去看一下,
CSDN
三、常量的進一步了解
C語言中的常量分為以下以下幾種:
- 字面常量
- const 修飾的常變數
- #define 定義的識別符號常量
- 列舉常量
1、字面常量
直接用鍵盤打出來的就是字面常量:
#include<stdio.h>
int main()
{
100;//整型常量
3.14;//浮點型別常量
'a';//字符常量
"abcd";//字串常量
return 0;
}
2、const 修飾的常變數
一個變數沒有被const修飾,那這個變數的值是可以改變的:

一個變數被const修飾后,那這個變數的值就不可以被修改:

const的用法:
當一個變數不想被別人修改,就可以在這個變數前面加const,
雖然加上const以后變數不能被修改,但是本質上它還是一個變數,
3、#define 定義識別符號常量

#define 定義的識別符號常量大寫小寫都可以,一般習慣大寫
4、列舉常量(這里只是簡單了解一下,后面還會講述)
列舉就是一一列舉
- 生活中有很多值都是可以一一列舉的(比如性別:男、女、保密)
- 有些值不適合一一的列舉(比如工資)
列舉是要定義后才可以使用:
//定義列舉型別
enum Sex
{
//列舉型別的可能取值---就是列舉常量
MALE,
FEMALE,
SECRET
}; //這個;必須要加
int main()
{
//列舉常量的使用
enum Sex s = MALE;
//列印列舉常量
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}
列舉常量不可以直接修改它的值

列舉常量的默認是從0開始,依次向下遞增1
四、字串
C語言中是沒有字串型別的,在C語言中由雙引號引起來的一串字符稱為字串字面值,或者簡稱字串,
例如:
"Hello World\n"
"abc";//字串
"a";//字串
"";//空字串
1、字串的定義:
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
2、輸出字串:
C語言中使用%s這個格式符輸出字串

3、列印字符陣列

為什么這個兩個字符陣列列印出來的內容不一樣呢?
接下來我們來看一下這兩個字符陣列在記憶體中的存盤:

從字符陣列在記憶體中的存盤可以發現arr1最后多了一個'\0',
字串的末尾其實隱藏一個'\0','\0'是字串的結束標志arr1在列印的時候遇到了'\0'就結束了,而arr2是一個字符一個字符放進去的,如果不放'\0'這個字符那么arr2是找不到結束標志的,所以arr2在列印出abc后不會停下來,直到在某個位置找到了'\0'才會停下來,所以abc后面就輸出了一些隨機值(亂碼),
如果想讓arr2也正常輸出,只要在字符'c'后面加上'\0',

我們再來看一下這兩個字符陣列在記憶體中的存盤:

由此可以得出:'\0'對字串是特別重要的!
字串的結束標志是一個 \0 的轉義字符,在計算字串長度的時候 \0 是結束標志,不算作字串內容,
4、strlen(string length)函式 :求字串長度的函式
在使用strlen這個函式的時候要引入#include<string.h>這個頭檔案
#include<stdio.h>
#include<string.h>
int main()
{
//使用strlen這個函式求字串的長度
int len = strlen("abc");
printf("%d\n", len);
return 0;
}
運行結果:

- 接下來使用strlen函式計算兩個字符陣列的長度
#include<stdio.h>
#include<string.h>
int main()
{
//可以把字串放在字符陣列中
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
//使用strlen函式計算字符陣列的長度
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));
return 0;
}
運行結果:

輸出結果說明:
- arr1字符陣列中的字串末尾隱藏了一個'\0',strlen在計算字符陣列長度的時候只計算'\0'之前的數,所以輸出3,
- arr2字符陣列中是存放了3個字符,這些字符中也沒有'\0'這個字符,所以strlen在計算字符陣列長度時就會輸出一個隨機值(這個值有可能是3,9,18......等任何值),
在arr2字符陣列中放一個'\0'字符再輸出

雖然在'\0'字符后面又加了兩個字符,但是strlen在計算字符陣列長度時只計算'\0'前面的字符!
五、轉義字符
轉義字符就在轉變原來的意思
| 轉義字符 | 釋義 |
|---|---|
| \? | 在書寫連續多個問號時使用,防止他們被決議成三字母(現在基本用不到了) |
| \' | 用于表示字符常量' |
| \" | 用于表示一個字串內部的雙引號 |
| \\ | 用于表示一個反斜杠,防止它被解釋為一個轉義序列符, |
| \a | 用警告字符,蜂鳴 |
| \b | 退格符 |
| \f | 進紙符 |
| \n | 換行 |
| \r | 回車 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \ddd | ddd表示1~3個八進制數字,例如:\123 轉換后就是S |
| \xddd | dd表示2個十六進制數字,例如:\x30轉換后就是 0 |
#include<stdio.h>
int main()
{
printf("hehenhehe");
printf("\n------------\n");
printf("hehe\nhehe");
return 0;
}
運行結果:

\n就是一個轉義字符(\n就是一個換行);\0也是一個轉義字符
列印一個檔案路徑:
輸出幾個轉義字符看一下代碼執行結果:

重點說一下 \ddd 和 \xdd(這里的x只能是小寫)這兩個轉義字符
- \ddd,ddd表示1~3個八進制數字
\123為什么是S呢?
\123其實是將八進制的123轉換成了十進制的83(計算程序:1*8^2+2*8^1+3*8^0=83)
83作為ASCII碼值所代表的字符就是S,所以\123會列印出S
補充:八進制是0~7,所以八進制數中最大的數是7,例如: \811、\181、\178這些都是錯的
- \xdd,dd表示2個十六進制數字
\x30轉換后為什么是 0呢?
\x30其實是將十六進制的30轉換成了十進制的48(計算程序:3*16^1+0*16^0=48)
48作為ASCII碼值所代表的字符就是0,所以\x30會列印出0
補充:十六進制數是:0~9與a~f共同組成
再回到一開始的列印一個檔案路徑:
#include<stdio.h>
int main()
{
//列印一個檔案路徑
printf("E:\\2021_10_17\\test.c\n");
return 0;
}運行結果:
六、注釋
C語言有兩種注釋方式:
- 單行注釋: //
- 多行注釋: /* */
- // 這種是C99之后引入的注釋方式 ----->C++的注釋風格
- /* 這種是C99之前C語言的注釋方式 ---->C語言的注釋風格*/
#include<stdio.h>
int main()
{
//int a = 10; //單行注釋
//int b = 20;
/* 多行注釋
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
*/
return 0;
}
補充:多行注釋的缺陷是不支持嵌套注釋
注釋的作用:
- 代碼比較復雜最好加上注釋,時間久了有助于自己閱讀代碼,加上注釋也有助于別人閱讀你的代碼,
- 代碼暫時不用的時候,也可以注釋掉,
不要過分注釋,注釋不要寫的太過于詳細!
七、總結
C語言中有許多有趣的東西,可能看著代碼會覺得有些枯燥,看到一大堆文字會看不下去,
編程的學習在于多動手多寫代碼這樣才會有所識訓,
一開始寫代碼肯定會出現很多的問題,只有不斷的出錯不斷地改錯自己才會進步,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323045.html
標籤:其他


