網(wǎng)站開發(fā)維護(hù)花費(fèi)seo關(guān)鍵詞分析表
C語言基礎(chǔ)知識(shí)
- ==1.第一個(gè)C語言程序==
- ==2.注釋==
- ==3.標(biāo)識(shí)符==
- ==4.關(guān)鍵字==
- ==5.數(shù)據(jù)類型==
- ==6.變量==
- ==7.常量==
- ==8.運(yùn)算符==
- ==9.輸入輸出==
- 輸入
- 輸出
1.第一個(gè)C語言程序
C語言的編程框架
#include <stdio.h>
int main()
{/* 我的第一個(gè) C 程序 */printf("Hello, World! \n");return 0;
}
2.注釋
單行注釋: //第一種寫法 /* 單行注釋 */
多行注釋:/* 多行注釋多行注釋多行注釋*/
3.標(biāo)識(shí)符
C 標(biāo)識(shí)符是用來
標(biāo)識(shí)
變量、函數(shù),或任何其他用戶自定義項(xiàng)目的名稱
。
規(guī)定:C語言的的標(biāo)識(shí)符由數(shù)字
,字母
,下劃線
構(gòu)成,但不能以數(shù)字開頭
。
可以作為標(biāo)識(shí)符的
mohd ,? zara , ? abc , ?move_name ,? a_123
myname50 , ? _temp , ?j , ? a23b9 , ? retVal
不可以作為標(biāo)識(shí)符的
12mb ,? 23_m
4.關(guān)鍵字
具有特殊含義的標(biāo)識(shí)符,C語言已經(jīng)使用的了,
用戶自定義標(biāo)識(shí)符時(shí)不能再使用
。 后續(xù)的學(xué)習(xí)都會(huì)慢慢接觸這些,現(xiàn)在只需要眼熟即可。
5.數(shù)據(jù)類型
數(shù)據(jù)類型就像一個(gè)盒子一樣,盒子中存放數(shù)據(jù),不同的數(shù)據(jù)要用不同的盒子裝。
為了限制變量中所存儲(chǔ)的數(shù)據(jù)(至少是可以兼容的)。
為了限制變量所占空間
先學(xué)習(xí)基本數(shù)據(jù)類型,其他的數(shù)據(jù)類型后續(xù)學(xué)習(xí)
char //字符數(shù)據(jù)類型
short //短整型
int //整形
long //長整型
long long //更長的整形
float //單精度浮點(diǎn)數(shù)
double //雙精度浮點(diǎn)數(shù)
C語言本身并沒有字符串類型
,我們在C語言程序中使用的字符串實(shí)際上是字符數(shù)組,即多個(gè)字符構(gòu)成的就是字符串!
- 整型
- 浮點(diǎn)型
為了得到某個(gè)類型或某個(gè)變量在特定平臺(tái)上的準(zhǔn)確大小,可以使用 sizeof 運(yùn)算符。表達(dá)式 sizeof(type)
得到對象或類型的存儲(chǔ)字節(jié)大小。
#include<stdio.h>int main(){printf("int 存儲(chǔ)大小 : %d \n", sizeof(int)) ;return 0;}
數(shù)據(jù)類型的轉(zhuǎn)換
類型轉(zhuǎn)換是將一個(gè)數(shù)據(jù)類型的值轉(zhuǎn)換為另一種數(shù)據(jù)類型的值。
-
隱式類型轉(zhuǎn)換:隱式類型轉(zhuǎn)換是在表達(dá)式中
自動(dòng)發(fā)生的
,無需進(jìn)行任何明確的指令或函數(shù)調(diào)用。它通常是將一種較小的類型自動(dòng)轉(zhuǎn)換為較大的類型,例如,將int類型轉(zhuǎn)換為long類型或float類型轉(zhuǎn)換為double類型。隱式類型轉(zhuǎn)換也可能會(huì)導(dǎo)致數(shù)據(jù)精度丟失或數(shù)據(jù)截?cái)唷?/code>
int i = 10;float f = 3.14;double d = i + f; // 隱式將int類型轉(zhuǎn)換為double類型
-
顯式類型轉(zhuǎn)換:顯式類型轉(zhuǎn)換需要使用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符(type casting
operator),它可以將一個(gè)數(shù)據(jù)類型的值強(qiáng)制轉(zhuǎn)換
為另一種數(shù)據(jù)類型的值。強(qiáng)制類型轉(zhuǎn)換可以使程序員在必要時(shí)對數(shù)據(jù)類型進(jìn)行更精確的控制,但也可能會(huì)導(dǎo)致數(shù)據(jù)丟失或截?cái)唷?/code>
double d = 3.14159;int i = (int)d; // 顯式將double類型轉(zhuǎn)換為int類型
6.變量
生活中有些值是可變的(比如:年齡,體重,薪資),需要用變量來表示 數(shù)據(jù)類型決定了
變量存儲(chǔ)的大小和布局
,該范圍內(nèi)的值都可以存儲(chǔ)在內(nèi)存中
變量兩部步驟(定義,初始化)
1.定義:
數(shù)據(jù)類型 variable_list;
數(shù)據(jù)類型,可以是整型、浮點(diǎn)型、字符型、指針等,也可以是用戶自定義的對象。
variable_list 可以由一個(gè)或多個(gè)變量的名稱組成
,多個(gè)變量之間用逗號(hào),分隔
舉例:
int age; //age 被定義為一個(gè)整型變量。
float salary; //salary 被定義為一個(gè)浮點(diǎn)型變量。
char grade; //grade 被定義為一個(gè)字符型變量。
int *ptr; //ptr 被定義為一個(gè)整型指針變量。
int i, j, k; //聲明并定義了變量 i、j 和 k
2.初始化(賦值)
int x; // 整型變量x定義
x = 20; // 變量x初始化為20
float pi; // 浮點(diǎn)型變量pi定義
pi = 3.14159; // 變量pi初始化為3.14159
char ch; // 字符型變量ch定義
ch = 'B'; // 變量ch初始化為字符'B'
為了簡化,可以定義的同時(shí)初始化
int x = 10; // 整型變量 x 初始化為 10
float pi = 3.14; // 浮點(diǎn)型變量 pi 初始化為 3.14
char ch = 'A'; // 字符型變量 ch 初始化為字符 'A'
extern int d = 3, f = 5; // d 和 f 的聲明與初始化
int d = 3, f = 5; // 定義并初始化 d 和 f
byte z = 22; // 定義并初始化 z
如果變量不初始化
整型變量(int、short、long等):默認(rèn)值為0。
浮點(diǎn)型變量(float、double等):默認(rèn)值為0.0。
字符型變量(char):默認(rèn)值為’\0’,即空字符。
指針變量:默認(rèn)值為NULL,表示指針不指向任何有效的內(nèi)存地址。
7.常量
常量是
固定值
,在程序執(zhí)行期間不會(huì)改變。這些固定的值,又叫做字面量。
-
整數(shù)常量
前綴:整數(shù)常量可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制的常量
。前綴指定基數(shù):0x 或 0X 表示十六進(jìn)制
,0 表示八進(jìn)制
,不帶前綴則默認(rèn)表示十進(jìn)制
。后綴:后綴是 U 和 L 的組合
,U 表示無符號(hào)整數(shù)(unsigned)
,L 表示長整數(shù)(long)
。后綴可以是大寫,也可以是小寫
,U 和 L 的順序任意。212 /* 合法的 */ 215u /* 合法的 */ 0xFeeL /* 合法的 */ 十六進(jìn)制數(shù) FEE 078 /* 非法的:8 不是八進(jìn)制的數(shù)字 */ 032UU /* 非法的:不能重復(fù)后綴 */ ============================================== 85 /* 十進(jìn)制 */ 0213 /* 八進(jìn)制 */ 0x4b /* 十六進(jìn)制 */ 30 /* 整數(shù) */ 30u /* 無符號(hào)整數(shù) */ 30l /* 長整數(shù) */ 30ul /* 無符號(hào)長整數(shù) */
-
浮點(diǎn)常量
浮點(diǎn)常量由整數(shù)部分
、小數(shù)點(diǎn)
、小數(shù)部分和指數(shù)部分
組成當(dāng)使用
小數(shù)形式
表示時(shí),必須包含小數(shù)點(diǎn)
。
例如 0.123、.123、123.、0.0等都是合法的實(shí)型常量。當(dāng)使用
指數(shù)形式
表示時(shí),字母e或E之前必須要有數(shù)字,且e或E后面的指數(shù)必須為整數(shù)
例如 +1.2E+5,1.5e-9,-5.0e10等都是合法的實(shí)型常量。不帶 f、F、l 或 L 后綴的浮點(diǎn)常量類型為 double。 如果后綴是字母 f 或 F,則常量的類型為 float。 如果后綴是字母 l 或 L,則常量的類型為 long double。
10.0 /* Has type double */ 10.0F /* Has type float */ 10.0L /* Has type long double */
-
整數(shù)常量
字符常量是括在單引號(hào)中,例如,‘x’ 可以存儲(chǔ)在 char 類型的簡單變量中
字符常量可以是一個(gè)普通的字符(例如 'x')
、一個(gè)轉(zhuǎn)義序列(例如 '\t')
,或一個(gè)通用的字符(例如 '\u02C0')
。在 C 中,有一些特定的字符,當(dāng)它們前面有反斜杠時(shí),它們就具有特殊的含義,被用來表示如換行符(\n)或制表符(\t)等。下表列出了一些這樣的轉(zhuǎn)義序列碼:
字符常量的 ASCII 值可以通過強(qiáng)制類型轉(zhuǎn)換轉(zhuǎn)換為整數(shù)值。char myChar = 'a'; int myAsciiValue = (int) myChar; // 將 myChar 轉(zhuǎn)換為 ASCII 值 97
常量的定義
在 C 中,有兩種簡單的定義常量的方式:
-
使用 #define 預(yù)處理器: #define 可以在程序中定義一個(gè)常量,它在編譯時(shí)會(huì)被替換為其對應(yīng)的值。
-
使用 const 關(guān)鍵字:const 關(guān)鍵字用于聲明一個(gè)只讀變量,即該變量的值不能在程序運(yùn)行時(shí)修改。
#define 預(yù)處理器
#define 常量名 常量值
#define PI 3.14159
在程序中使用該常量時(shí),編譯器會(huì)將所有的 PI 替換為 3.14159
。
#include <stdio.h>#define LENGTH 10
#define WIDTH 5
#define NEWLINE '\n'int main()
{int area; area = LENGTH * WIDTH;printf("value of area : %d", area);printf("%c", NEWLINE);return 0;
}
const 關(guān)鍵字
const 數(shù)據(jù)類型 常量名 = 常量值;
const int MAX_VALUE = 100;
在程序中使用該常量時(shí),其值將始終為100,并且不能被修改。
#include <stdio.h>int main()
{const int LENGTH = 10;const int WIDTH = 5;const char NEWLINE = '\n';int area; area = LENGTH * WIDTH;printf("value of area : %d", area);printf("%c", NEWLINE);return 0;
}
#define 與 const 區(qū)別(了解即可)
#define 與 const 這兩種方式都可以用來定義常量,選擇哪種方式取決于具體的需求和編程習(xí)慣。通常情況下,建議使用 const 關(guān)鍵字來定義常量,因?yàn)樗哂蓄愋蜋z查和作用域的優(yōu)勢,而 #define 僅進(jìn)行簡單的文本替換,可能會(huì)導(dǎo)致一些意外的問題。
#define 預(yù)處理指令和 const 關(guān)鍵字在定義常量時(shí)有一些區(qū)別:
替換機(jī)制:#define 是進(jìn)行簡單的文本替換,而 const 是聲明一個(gè)具有類型的常量。#define 定義的常量在編譯時(shí)會(huì)被直接替換為其對應(yīng)的值,而 const 定義的常量在程序運(yùn)行時(shí)會(huì)分配內(nèi)存,并且具有類型信息。
類型檢查:#define 不進(jìn)行類型檢查,因?yàn)樗皇沁M(jìn)行簡單的文本替換。而 const 定義的常量具有類型信息,編譯器可以對其進(jìn)行類型檢查。這可以幫助捕獲一些潛在的類型錯(cuò)誤。
作用域:#define 定義的常量沒有作用域限制,它在定義之后的整個(gè)代碼中都有效。而 const 定義的常量具有塊級作用域,只在其定義所在的作用域內(nèi)有效。
調(diào)試和符號(hào)表:使用 #define 定義的常量在符號(hào)表中不會(huì)有相應(yīng)的條目,因?yàn)樗皇沁M(jìn)行文本替換。而使用 const 定義的常量會(huì)在符號(hào)表中有相應(yīng)的條目,有助于調(diào)試和可讀性。
8.運(yùn)算符
9.輸入輸出
輸入
1.輸入:scanf()
格式:scanf(控制串,&var1,&var2,…);
其中控制串由三部分組成:
- 格式說明符:前綴為%,用于告訴方法下次要讀入何種數(shù)據(jù)類型的數(shù)據(jù),并順次放到方法后的變量中.
- 空白符:由
空格(" ")、制表符("\t")和新行符("\n")表示,
讓方法在輸入流中忽略一個(gè)或多個(gè)空白符(只要存在一個(gè)就可以忽略多個(gè))??刂拼械目瞻追?scanf() 在輸入流中讀,但不保存結(jié)果,直到發(fā)現(xiàn)非空白字符為止。 - 非空白符:除去格式說明符和空白符以外的其他字符,如逗號(hào),分號(hào),于空白符相同,scanf()在輸入流中讀,但不保存結(jié)果。
如果格式符之間添加了空格,那么按照規(guī)則,會(huì)忽略掉全部的空白符
直到遇到下一個(gè)不是空白符的字符
格式說明符 | 意義 |
---|---|
%d | 輸入有符號(hào)的十進(jìn)制數(shù) |
%u | 輸入無符號(hào)的十進(jìn)制數(shù) |
%o | 輸入無符號(hào)的八進(jìn)制數(shù) |
%x/X | 輸入無符號(hào)的十六進(jìn)制數(shù) |
%i | 輸入八進(jìn)制,十進(jìn)制,十六進(jìn)制數(shù) (更通用) |
%c | 輸入單個(gè)字符 |
%s | 輸入字符串,將字符串送到一個(gè)字符組中,在輸入時(shí)以非空白字符開始 ,以第一個(gè)空白字符結(jié)束 |
%f | 輸入實(shí)數(shù),可以用小數(shù)形式或指數(shù)形式輸入 |
%e,E,g,G | 與f作用相同,e與f,g可以相互替換 |
附加格式符(也稱修飾符)
字符 | 說明 |
---|---|
h | 輸入短整型數(shù)據(jù)(可用到%hd,%ho,%hx) |
l | 輸入長整型數(shù)據(jù)(可用到%ld,%1o,%lx.%lu)以及double型數(shù)據(jù) (%lf ,%le) |
域?qū)?/code> | 指定輸入數(shù)據(jù)所占的寬度(列數(shù)),域?qū)拺?yīng)為正整數(shù) |
* | 本輸入項(xiàng)在讀入后不賦給相應(yīng)的變量 |
舉例
讀入整數(shù)
讀入一個(gè)整數(shù):
int a;
scanf("%d",&a);讀入多個(gè)整數(shù) 輸入12 1 3
int a,b,c;
scanf("%d %d %d,&a,&b,&c);讀入以逗號(hào)分隔的多個(gè)整數(shù): 輸入1,2,3
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);總之一句話,按照格式輸入進(jìn)行讀取整數(shù)
讀入其他類型的數(shù)字
參考讀入整數(shù),其他類型的數(shù)字使用方式相同,要注意的是
為了讀取長整數(shù)
,可以將 l 放在格式說明符的前面
(如%ld,%lu
);
為了讀取短整數(shù)
,可以將 h 放在格式說明符的前面
(如%hd
),
如果要強(qiáng)調(diào)。這些修飾符可以與 d、i、o、u 和 x 格式代碼一起使用。
讀入單個(gè)字符
在用%c格式聲明輸入字符時(shí),空格
和“轉(zhuǎn)義字符”中的字符
都會(huì)作為有效字符輸入!所以如果要連續(xù)賦給變量
scanf(”%c%c%c",&a,&b,&c),此時(shí)應(yīng)該連續(xù)輸入abc,而不是a b c。int i;
char k;
scanf("%d %c",&i,&k);
/**
* 這個(gè)時(shí)候輸入"1\na"和"1a"的效果是一樣的,因?yàn)闊o論怎么換行,都屬于空白符,會(huì)被忽略
*/
scanf("%d%c",&i,&k);
/**
* 這個(gè)時(shí)候輸入"1\na",運(yùn)行后k會(huì)接收到換行符,而不是"a",因?yàn)榭瞻追麤]有被忽略,而%c對所有字符一視同仁。
*/
讀入字符串
始終要注意的是讀入字符串是scanf()方法的功能,而該方法是屬于c的
,因此它不支持c++新增的string類型
char str[80];
scanf("%s",str);//注意這里不需要&,因?yàn)閟tr是數(shù)組,傳入的已經(jīng)是指針了
要注意%s雖然是讀入字符串,但它也會(huì)忽略空白符,下面例子中的兩行scanf()方法是等價(jià)的,因?yàn)?s本身就有忽略空白符的功能。
char stra[80];
char strb[80];
scanf("%s %s",stra,strb);
scanf("%s%s",stra,strb);
以非空白字符開始,以第一個(gè)空白字符結(jié)束為第一個(gè)字符串
雖然會(huì)忽略空白符,但是會(huì)主動(dòng)的在最后一個(gè)字符后添加"\0"表示字符串結(jié)束
(也因此,char數(shù)組不需要初始化就可以接受字符串,一般情況下不影響操作),因此在設(shè)置char數(shù)組長度時(shí)候,最好要比理論中的最大長度多預(yù)留一個(gè)長度
。
char str[5];//如果題目接受的最大字符串長度是4,那么設(shè)置的數(shù)組長度最好大于等于5
scanf("%s",str);
要注意的是,方法對空白符的忽略不是拋棄了空白符
,如果沒有繼續(xù)讀下去的話,接受字符串后的空白符是會(huì)保留在緩沖區(qū)
的,這個(gè)時(shí)候使用%c接收是可以接收到,這個(gè)可能困擾了很多人,一定要注意。
char k;
char str[10];
scanf("%s%c",str,&k);
/**
* 如果輸入"abcd",那么會(huì)直接運(yùn)行結(jié)束,str="abcd",k='\n'
*/
2.輸入:getchar()
字面意思,接收單個(gè)字符
,使用方法
char a;
a = getchar();實(shí)際上效果等同于char a;
scanf("%c",&a);
3.輸入:gets()
字面意思,讀取多個(gè)字符,實(shí)際上是讀取一整行
,使用方法
char str[80];
gets(str);
由于gets()不檢查字符串string的大小
,必須遇到換行符或文件結(jié)尾才會(huì)結(jié)束輸入,因此容易造成緩存溢出的安全性問題,導(dǎo)致程序崩潰,可以使用fgets()代替。
區(qū)別:
scanf() 讀取字符串時(shí)以空格為分隔,遇到空格就認(rèn)為當(dāng)前字符串結(jié)束了,所以無法讀取含有空格的字符串。
gets() 認(rèn)為空格也是字符串的一部分,只有遇到回車鍵時(shí)才認(rèn)為字符串輸入結(jié)束,所以,不管輸入了多少個(gè)空格,只要不按下回車鍵,對 gets() 來說就是一個(gè)完整的字符串。
也就是說,gets() 能讀取含有空格的字符串,而 scanf() 不能。
4.輸入:fgets()
是對gets()方法的擴(kuò)展,gets()是從標(biāo)準(zhǔn)輸入流中讀取,而fgets()是從文件輸入流中讀取,但是文件輸入流并不局限于普通的文件,只要是流都可以用來輸入,使用方法:
char str[80];
fgets(str,79,stdin);
fgets()函數(shù)的作用可以這么解釋:從第三個(gè)參數(shù)
指定的流中讀取最多第二個(gè)參數(shù)大小的字符到第一個(gè)參數(shù)指定的容器地址中
。在這個(gè)過程中,在還沒讀取夠第二個(gè)參數(shù)指定大小的字符前,讀取到換行符’\n’或者需要讀取的流中已經(jīng)沒有數(shù)據(jù)了。則提前結(jié)束,并把已經(jīng)讀取到的字符存儲(chǔ)進(jìn)第一個(gè)參數(shù)指定的容器地址中。
注意事項(xiàng)
1.fgets()函數(shù)的注意事項(xiàng)1
fgets()函數(shù)的最大讀取大小是其“第二個(gè)參數(shù)減1”
,這是由于字符串是以’\0’為結(jié)束符的,fgets()為了保證輸入內(nèi)容的字符串格式,當(dāng)輸入的數(shù)據(jù)大小超過了第二個(gè)參數(shù)指定的大小的時(shí)候,fgets()會(huì)僅僅讀取前面的“第二個(gè)參數(shù)減1”個(gè)字符,而預(yù)留1個(gè)字符的空間來存儲(chǔ)字符串結(jié)束符’\0’
。
2.fgets()函數(shù)的注意事項(xiàng)2
在fgets()函數(shù)的眼里,換行符’\n’也是它要讀取的一個(gè)普通字符而已。在讀取鍵盤輸入的時(shí)候會(huì)把最后輸入的回車符也存進(jìn)數(shù)組里面,即會(huì)把’\n’也存進(jìn)數(shù)組里面,而又由于字符串本身會(huì)是以’\0’結(jié)尾的。所以在輸入字符個(gè)數(shù)沒有超過第二個(gè)參數(shù)
指定大小之前,你輸入n個(gè)字符按下回車輸入,fgets()存儲(chǔ)進(jìn)第一個(gè)參數(shù)指定內(nèi)存地址的是n+2個(gè)字節(jié)。最后面會(huì)多出一個(gè)’\n’和一個(gè)’\0’,而且’\n’是在’\0’的前面一個(gè)(\n\0)。
輸出
1.輸出:printf()
printf函數(shù)一般格式:printf(格式控制,輸出列表)
1)格式控制:格式聲明:由“%"和格式字符組成,如%d,%f
(1)格式控制:格式聲明:由“%"和格式字符組成,如%d,%f
???????????????普通字符:需要在輸出時(shí)原樣輸出的字符。
(2)輸出列表:是程序需要輸出的一些數(shù)據(jù),可以是常量,變量或表達(dá)式。
格式字符
格式附加字符
*號(hào)的用法
*在printf里可以代表一個(gè)泛整數(shù),可以代表任何整數(shù)。它可以出現(xiàn)在位寬的位置,也可以出現(xiàn)在小數(shù)位數(shù)的位置。但在printf的雙引號(hào)外面,必須要有*對應(yīng)的數(shù)值
。
比如我的位寬不確定,想用整數(shù)a表示,則可以寫成:
2.輸出:putchar()